sheets sheet script para hoja google formulario envios envio enviar después desde correos correo contestar como calculo automáticamente automatizar automatico javascript google-apps-script google-spreadsheet

javascript - sheet - Google Apps Script-Enviar correo electrónico basado en la fecha en la celda



google script send email (3)

He mirado alrededor y tengo partes pero no puedo armar el rompecabezas. Estoy intentando crear una secuencia de comandos que se ejecutará en un desencadenador configurado para ejecutarse diariamente. El disparador se configurará en la opción de Recursos en el editor.

Básicamente estoy buscando la secuencia de comandos para capturar un rango de celdas, identificar una fecha de vencimiento, que se completará en una columna, que coincida con la fecha actual. Si coincide, envía un correo electrónico. Empecé con el envío de un correo electrónico del tutorial de hojas de cálculo en Google. He agregado una declaración if para verificar la fecha, pero la estoy perdiendo en la comparación con dataRange. Cualquiera puede ayudar a corregir esto o dirigirme hacia la investigación.

Parece que se ejecuta el script, pero no ocurre nada, lo que creo es porque "if (currentTime == dataRange)" ¿El dataRange no coincide correctamente?

Aquí está el código:

function sendEmails() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = 50; // Number of rows to process // Fetch the range of cells var dataRange = sheet.getRange(startRow, 1, numRows, 2) // Fetch values for each row in the Range. var data = dataRange.getValues(); //Get todays date var currentTime = new Date(); var month = currentTime.getMonth() + 1; var day = currentTime.getDate(); var year = currentTime.getFullYear(); //Test column for date due & match to current date if ( currentTime == dataRange) { for (i in data) { var row = data[i]; var emailAddress = row[0]; // First column var message = row[1]; // Second column var subject = "Task Item Due"; MailApp.sendEmail(emailAddress, subject, message); } } }

Estoy actualizando la sugerencia proporcionada por Srik y proporcionando su sugerencia en el siguiente código. He intentado publicar esto un par de veces, por lo que no estoy seguro de por qué no está pasando revisión por pares pasado?

function sendEmail() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = 50; // Number of rows to process var dataRange = sheet.getRange(startRow, 1, numRows, 50); // Fetch values for each row in the Range. var data = dataRange.getValues(); //Browser.msgBox(data) for (i in data) { var row = data[i]; var date = new Date(); var sheetDate = new Date(row[1]); if (date.getDate() == sheetDate.getDate() && date.getMonth() == sheetDate.getMonth() && date.getFullYear() == sheetDate.getFullYear()); { var emailAddress = row[0]; // First column var message = row[2]; // Second column var subject = "Sending emails from a Spreadsheet"; MailApp.sendEmail(emailAddress, subject, message); // Browser.msgBox(emailAddress) } } }

Parece que se ejecuta el código pero obtengo el siguiente error w / en el editor de scripts. "Error al enviar el correo electrónico: no hay destinatario (línea 23)". Pero aún envía correos electrónicos. Debe comparar las fechas y solo enviar el correo electrónico si la fecha coincide. Está enviando un correo electrónico por cada fila. He compartido la hoja de cálculo para ver el código y cómo está configurada la hoja de cálculo. Hoja de cálculo compartida

CÓDIGO ACTUALIZADO W / SERGE HELP en el registrador y Utilities.formatDate .. ¡Gracias!

function sendEmail() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = sheet.getLastRow()-1; // Number of rows to process // Fetch the range of cells A2:B3 var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); // Fetch values for each row in the Range. var data = dataRange.getValues(); //Logger.log(data) for (i in data) { var row = data[i]; var date = new Date(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); //Logger.log(date); var sheetDate = new Date(row[2]); //Logger.log(sheetDate); var Sdate = Utilities.formatDate(date,''GMT+0200'',''yyyy:MM:dd'') var SsheetDate = Utilities.formatDate(sheetDate,''GMT+0200'', ''yyyy:MM:dd'') Logger.log(Sdate+'' =? ''+SsheetDate) if (Sdate == SsheetDate){ var emailAddress = row[0]; // First column var message = row[1]; // Second column var subject = "Your assigned task is due today." +message; MailApp.sendEmail(emailAddress, subject, message); //Logger.log(''SENT :''+emailAddress+'' ''+subject+'' ''+message) } } }


Aquí hay una versión de trabajo de su código. Utilicé Utilities.formatDate para hacer cadenas de fechas, para que pueda elegir lo que compara (solo días, horas, minutos).

Comenté la llamada por correo solo para mis pruebas, vuelve a habilitarla cuando lo necesites

function sendEmail() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = sheet.getLastRow()-1; // Number of rows to process // Fetch the range of cells A2:B3 var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); // Fetch values for each row in the Range. var data = dataRange.getValues(); Logger.log(data) for (i in data) { var row = data[i]; var date = new Date(); var sheetDate = new Date(row[1]); Sdate=Utilities.formatDate(date,''GMT+0200'',''yyyy:MM:dd'') SsheetDate=Utilities.formatDate(sheetDate,''GMT+0200'', ''yyyy:MM:dd'') Logger.log(Sdate+'' =? ''+SsheetDate) if (Sdate == SsheetDate){ var emailAddress = row[0]; // First column var message = row[2]; // Second column var subject = "Sending emails from a Spreadsheet"; // MailApp.sendEmail(emailAddress, subject, message); Logger.log(''SENT :''+emailAddress+'' ''+subject+'' ''+message) } } }

no te olvides de mirar los registros ;-)


Estás comparando dos objetos diferentes aquí

if ( currentTime == dataRange) {

currentTime es un objeto Date mientras que dataRange es un objeto Range - nunca serán iguales y, por lo tanto, no pasa nada. Lo que podría hacer es (DATE_COL es la columna que tiene su fecha)

for ( var i in data ){ var row = data[i] ; var today = new Date(); var date = new Date(row[DATE_COL]) ; if (today.getDate() == date.getDate() && today.getMonth() == date.getMonth() && today.getYear() == date.getYear() { /* Your email code here */ } }


Lo haría de esta manera ...

Configure la hoja de cálculo de esta manera: https://docs.google.com/spreadsheet/ccc?key=0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc

Cambiar el código a:

function sendEmails() { var spreadsheet = SpreadsheetApp.openById(''Type spreadsheet key here from spreadsheet URL''); /// e.g. var spreadsheet = SpreadsheetApp.openById(''0AkGlO9jJLGO8dDJad3VNTkhJcHR3UXlJSVRNTFJreWc''); var sheet = spreadsheet.getSheets()[0]; // gets the first sheet, i.e. sheet 0 var range = sheet.getRange("B1"); var dateString = new Date().toString(); range.setValue(dateString); // this makes all formulas recalculate var startRow = 4; // First row of data to process var numRows = 50; // Number of rows to process // Fetch the range of cells var dataRange = sheet.getRange(startRow, 1, numRows, 4) // Fetch values for each row in the Range. var data = dataRange.getValues(); for (i in data) { var row = data[i]; if( row[3] == true) { var emailAddress = row[0]; // First column var message = row[1]; // Second column var subject = "Task Item Due"; try { MailApp.sendEmail(emailAddress, subject, message); } catch(errorDetails) { // MailApp.sendEmail("[email protected]", "sendEmail script error", errorDetails.message); } } } }

El gatillo:

Debido al activador, deberá abrir la hoja de cálculo utilizando openById. Para hacer esto, en el código, reemplace ''Escriba la clave de la hoja de cálculo aquí desde la URL de la hoja de cálculo''. Para encontrar la clave, abra la hoja de cálculo de Google Docs, el enlace tiene "clave = A0a0df ..." pegue el código. Mira el ejemplo.

JavaScript: si desea obtener más información sobre el uso de Java Script, recomiendo http://www.w3schools.com/js/default.asp