¿Cómo puedo obtener los datos de una fila entera en Google Sheets usando Google Apps Script?

publicado por: Anonymous

He creado un trigger que me envía un email cada vez que una hoja de Google Sheets es actualizada.

Pero en el mensaje yo quiero enviar los datos que se escribieron en cada una de las celdas de esa fila que fue actualizada.

En el código que estoy implementando sólo alcanzo a obtener el dato de la celda específica que se actualizó, pero no de la fila completa.

Mi código es el siguiente:

function onEdit(e) {
    var gSheet = SpreadsheetApp.getActiveSpreadsheet();
    var cell = gSheet.getDataRange().toString();
    var mEmail='[email protected]';
    var mSubject='Nuevo error 404';
    var mBody='Hoja modificada por: '+Session.getActiveUser()+
              'nDatos: '+gSheet.getActiveCell().getValue();
    MailApp.sendEmail(mEmail, mSubject, mBody);
}

Buscaba entre las posibilidades una especie de método getActiveRow(), pero no lo encuentro. ¿Cómo podría obtener todos los valores de esa fila?


Estado actual del código

Actualmente el código está así:

function onEdit(e) {
    Logger.log("e");
    var gSheet = SpreadsheetApp.getActiveSpreadsheet();
    var cell = gSheet.getDataRange().toString();
    var numFila = e.range.rowStart; 
    var fila = gSheet.getRange(numFila + ":" + numFila);
    var valoresFila = fila.getValues();
    var mEmail='[email protected]';
    var mSubject='Nuevo error 404';
    var mBody='Hoja modificada por: '+Session.getActiveUser()+"nDatos: "+gSheet.getActiveCell().getValue()+" c1: "+valoresFila[1]+" c2: "+valoresFila[2];
    MailApp.sendEmail(mEmail, mSubject, mBody);
}

Cuando la hoja se actualiza recibo un email, pero sin datos, algo así:

Hoja modificada por: [email protected]
Datos:

solución

Respuesta a la revisión 2, en lo que respecta al código agregado.

El problema son los índices en valoresFila[1] y valoresFila[2]. Asumiendo que quieres los valores de las celdas de la fila activa que corresponden a las columnas A y B, reemplázalos por valoresFila[0][0] y valoresFila[0][1]

Lo anterior porque getValues devuelve un Array de Arrays y en JavaScript los índices de los Arrays son base 0. El primer índice corresponde a la fila y el segundo a la columna.


En relación a la ejecución automática de la función al agregarse una respuesta desde un formulario de Google vinculado a la hoja de cálculo, en lugar de un activador on Edit usa un activador on Form Submit.

Lo anterior porque los activadores on Edit y on Change, ya sea simples o instalables sólo se activan por cambios hechos por el usuario que tiene abierta la hoja de cálculo, no por cambios hechos por otra aplicación, como los Formularios de Google, ni por código, ni por actualizaciones automáticas de funciones de hoja de cálculo como IMPORTRANGE.

NOTAS IMPORTANTES

  1. Google Apps Script maneja dos activadores instalables on Form Submit, uno para proyectos vinculados a hoja de cálculo y otro para proyectos vinculados a formularios, cada uno con objeto evento con propiedades particulares. Favor de consultar las propiedades de cada uno en Events.
  2. Los activadores como on Form Submit y time-driven no pueden hacer uso de métodos como SpreadsheetApp.getActiveCell() pues estos no emulan al usuario que abre una hoja de cálculo y por ende no existen celda, rango ni selección activos. Sin embargo, en el caso de proyectos vinculados a hoja de cálculo puede usarse sin problema SpreadsheetApp.getActiveSpreadsheet().
  3. En el caso de usar un activador on Form Submit en un proyecto vinculado a un formulario, si se requiere acceder a la hoja de cálculo vinculada, se podría usar getDestinationId() para obtener el id de la hoja de cálculo vinculada.

Respuesta a la revisión 1

De la pregunta…

Buscaba entre las posibilidades una especie de método getActiveRow(), pero no lo encuentro. ¿Cómo podría obtener todos los valores de esa fila?

Hay varias formas para obtener todos los valores de una fila.

  • Notación de referencias de hoja de cálculo 1:1
  • Usar la notación de array miArray[i]
  • Usar getRange(fila, columna, numeroFilas,numeroColumnas)

Por ejemplo, podemos usar

var numFila = e.range.rowStart; 
var fila = gSheet.getRange(numFila + ":" + numFila);
var valoresFila = fila.getValues();

donde valoresFila será un array de arrays de 1 x número de columnas de la hoja.

Si quieres limitar a sólo las filas del rango de datos (data range), podemos usar getLastColumn() el cual es ciertas circunstancias podría ser muy lento, o bien usar gSheet.getDataRange().getValues()[0].length para obtener el número de columnas de rango de datos.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *