Tengo este código en Google Apps Script que está vinculado a una hoja de Google:
function sendReminders() { var sheet = SpreadsheetApp.openById('1IvXctYLXMKrSYPPSuMg_4_AQopemHPSnLHmQQgBDqH8').getSheetByName('ÉVALUATION'); var startRow = 2; var numRows = sheet.getLastRow(); var numColumns = sheet.getLastColumn(); var dataRange = sheet.getRange(startRow, 1, numRows, numColumns); var data = dataRange.getValues(); for (var i in data) { var row = data[i]; var email = row[4]; var ccEmail = row[5]; var customId = row[1]; var dueDate = Utilities.formatDate(new Date(row[9]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var message = 'Votre E&A est dûe pour la date suivante : ' + dueDate + '. Merci de la compléter en cliquant sur le lien suivant : https://form.jotform.com/221156384847058?customId3=' + customId; var emailSent = row[12]; var value = Utilities.formatDate(new Date(row[10]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"); if (value == today && emailSent != 1) { var subject = 'Rappel - Enquête & Analyse'; MailApp.sendEmail(email, subject, message, { cc: ccEmail }); sheet.getRange((startRow + i), 13).setValue(1); SpreadsheetApp.flush(); } } }
Se supone que el script envía correos electrónicos de recordatorio. Todo funciona bien, excepto esta línea:
sheet.getRange((startRow + i), 13).setValue(1);
Esta línea debe agregar el valor de 1 a una celda específica en la hoja de cálculo de Google, en la fila actual en la que se encuentra el bucle for.
Sin embargo, en lugar de agregar el valor a la fila actual, omite filas y agrega el valor a alguna otra fila. En algunos casos hay una diferencia de 18 filas y en otros de 198 filas.
Aquí está el enlace de Google Sheet como referencia.
Pruébalo de esta manera:
function sendReminders() { const ss = SpreadsheetApp.openById('1IvXctYLXMKrSYPPSuMg_4_AQopemHPSnLHmQQgBDqH8'); var sh = ss.getSheetByName('ÉVALUATION'); var startRow = 2; var dataRange = sh.getRange(startRow, 1, sh.getLastRow() - 1, sh.getLastColumn()); var vs = dataRange.getValues(); vs.forEach((r, i) => { var email = r[4]; var ccEmail = r[5]; var customId = r[1]; var dueDate = Utilities.formatDate(new Date(r[9]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var message = 'Votre E&A est dûe pour la date suivante : ' + dueDate + '. Merci de la compléter en cliquant sur le lien suivant : https://form.jotform.com/221156384847058?customId3=' + customId; var emailSent = r[12]; var value = Utilities.formatDate(new Date(r[10]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"); if (value == today && emailSent != 1) { var subject = 'Rappel - Enquête & Analyse'; MailApp.sendEmail(email, subject, message, { cc: ccEmail }); sh.getRange(startRow + i, 13).setValue(1); } }); }
Noté algunos problemas en su hoja y script.
En su hoja de muestra, tiene valores en M22 , M27 y M210 . La función sheet.getLastRow()
incluirá esos valores y su última fila será 210 .
Si imprime el valor de los datos, hay una matriz vacía adicional.
Si intenta imprimir startRow + i
, los valores son 22, 23, 24...etc
. Simplemente agrega el valor de startRow
e i
y no realiza la suma de la operación aritmética.
Elimine los datos innecesarios o limpie su hoja para que el valor de numRows
se convierta en 12.
Dado que omite 1 fila, también debe deducir 1 fila a numRow. Simplemente agregue -1 a numRows en su getRange()
.
Use el método parseInt()
para la variable i
en sheet.getRange((startRow + i), 13).setValue(1);
.
Su código debería verse así:
function sendReminders() { var sheet = SpreadsheetApp.openById('1IvXctYLXMKrSYPPSuMg_4_AQopemHPSnLHmQQgBDqH8').getSheetByName('ÉVALUATION'); var startRow = 2; var numRows = sheet.getLastRow(); var numColumns = sheet.getLastColumn(); var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns); var data = dataRange.getValues(); for (var i in data) { var row = data[i]; var email = row[4]; var ccEmail = row[5]; var customId = row[1]; var dueDate = Utilities.formatDate(new Date(row[9]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var message = 'Votre E&A est dûe pour la date suivante : ' + dueDate + '. Merci de la compléter en cliquant sur le lien suivant : https://form.jotform.com/221156384847058?customId3=' + customId; var emailSent = row[12]; var value = Utilities.formatDate(new Date(row[10]), Session.getScriptTimeZone(), "yyyy-MM-dd"); var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"); if (value == today && emailSent != 1) { var subject = 'Rappel - Enquête & Analyse'; MailApp.sendEmail(email, subject, message, { cc: ccEmail }); sheet.getRange((startRow + parseInt(i)), 13).setValue(1); SpreadsheetApp.flush(); } } }
Muestra:
Nota: ajusté los valores de Fecha de recordatorio a mi fecha actual para que el script funcione.
Producción: