tutorial sheet scripts script google example español docs developers developer apps app google-apps-script google-spreadsheet google-spreadsheet-api

google apps script - sheet - Activador de correo electrónico de la hoja de cálculo



google apps script tutorial español pdf (2)

Parece que está utilizando una hoja de cálculo compartida para recopilar las solicitudes de agregar usuario y confiando en que los solicitantes completen la información. En el documento de detalles que compartió, parece que las solicitudes se AGREGARON, pero no EDITAR. (Esa es una importante distinción simplificadora)

Sugiero que lo que realmente necesita es usar un formulario para recibir esa entrada. El uso de un formulario creará una "tabla de datos" dentro de su hoja de cálculo, un conjunto de columnas con las que no debe meterse. (Puede editar los contenidos, agregar y eliminar filas, pero no debe agregar ni eliminar columnas). Sin embargo, PUEDE agregar columnas a la hoja de cálculo fuera de esta tabla, lo que le brinda un lugar útil para almacenar información de estado sobre el estado de cada individuo peticiones.

Además, puede activar su procesamiento para que se ejecute en el envío de formulario, en lugar de un simple "onEdit"; esto escapa al problema que ScampMichael señaló. Alternativamente, puede usar un desencadenador de edición instalable, como se describe en esta respuesta .

Pruebe esta hoja y este formulario . Guárdese una copia, acceda a la secuencia de comandos y elimine los comentarios que impiden que se envíen correos electrónicos, y pruébelo. Hay un elemento de menú en la hoja de cálculo que puede iniciar el procesamiento; simplemente borre la columna "Solicitar estado" para volver a ejecutarlo. Puede abrir el formulario (y encontrar su URL) y agregar más entradas para experimentar.

Es el núcleo de un sistema similar que he escrito, y contiene una discreta máquina de estados para procesar las solicitudes. Mi sistema tiene una gran cantidad de datos muy complejos en varias hojas de cálculo, por lo que a menudo se reemplaza y luego debe volver a ejecutarse. (Utilizo un disparador temporizado para eso). Es por eso que las solicitudes se manejan a través de estados. Si le parece demasiado complejo, extraiga solo las piezas que necesita.

Tengo una secuencia de comandos escrita en la hoja de cálculo de Google para enviar correos electrónicos cuando se modifica la hoja de cálculo o se agrega cualquier información. El desencadenador de correo electrónico funciona, pero cada vez que se ingresan datos en la siguiente fila, también se envía el correo electrónico a la dirección de correo electrónico anterior.

Por favor sugiera una solución

El siguiente es un guión escrito:

function onEdit(e) { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = 1; // Number of rows to process var dataRange = sheet.getRange(startRow, 1 , numRows,3) // Fetch the range of cells A2:B3 // Fetch values for each row in the Range. var data = dataRange.getValues(); for (i in data) { var row = data[i]; var emailAddress = row[2]; // First column var message = row[0] + "requested" + row [1]; // Second column var subject = "Sending emails from a Spreadsheet"; MailApp.sendEmail(emailAddress, subject, message); } }


Su pregunta no está clara ... en ninguna parte del script veo algo que lea qué celda se ha modificado realmente ... su rango objetivo está codificado en la fila 2, por lo que la única fila que puede procesarse es la fila 2 (y el correo solo puede ser enviado) enviado una vez) ...

Tu también puedes :

  • explicar cómo debería funcionar
  • explica cómo funciona ahora, especialmente a qué te refieres con ''correo electrónico anterior''
  • eliminar errores tipográficos en su código (la fila [2] no es la primera columna)
  • explique cómo desencadena esta función: el nombre onEdit(e) sugiere un desencadenador onEdit pero los desencadenantes simples no pueden enviar correo, por lo que supongo que ha configurado otro desencadenador.
  • explique por qué (e) en su parámetro de función y no lo usa?

EDITAR: gracias por el complemento de información. El script que sugiere no es suficiente para lograr lo que desea. La idea aquí es verificar si algo en la hoja ha sido modificado agregando (o insertando) una fila de datos o (si lo entendí bien) editando cualquier fila en la hoja con un nuevo valor.

Esto no es tan simple como parece a primera vista ;-)

Lo que haría sería tomar una "instantánea" de la hoja y -basada en un timer o en onEdit comparar esa instantánea con el estado actual de la hoja.

Hay más de una forma de obtener ese resultado, puede tener una segunda hoja en su hoja de cálculo que nadie pueda modificar y que sea una copia de la hoja principal que actualice después de cada modificación / envío de correo. Por lo tanto, antes de actualizar el script, debe buscar cualquier diferencia entre las hojas y enviar un informe al correo electrónico correspondiente cuando se encuentre una diferencia.

Otra forma de hacerlo es almacenar los datos de la hoja convertidos a una cadena en las propiedades del script, el principio es el mismo pero es más ''invisible'' para los usuarios normales que acceden a la hoja de cálculo.

También podría usar scriptDb o sus propiedades de usuario, pero las propiedades del script probablemente sean más adecuadas (más simples) para este caso de uso.

Cuéntanos qué piensas / prefieres y yo (u otra persona) probablemente podría darte un código para empezar.