setValue 函数跳过行而不是在 for 循环中选择当前行

setValue function skipping rows instead of choosing current in for loop

我在链接到 Google Sheet:

的 Google Apps 脚本中有这段代码
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();
    }
  }

}

脚本应该发送提醒邮件。一切正常,除了这一行:

sheet.getRange((startRow + i), 13).setValue(1);

此行应将值 1 添加到 Google Sheet 中的特定单元格,在 for 循环所在的当前行中。

但是,它不会将值添加到当前行,而是跳过行并将值添加到其他行。在某些情况下,相差 18 行,而在其他情况下,相差 198 行。

这里是Google Sheet link供参考。

这样试试:

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);
    }
  });
}

我注意到您的 sheet 和脚本中存在一些问题。

  1. 在您的示例 sheet 中,您在 M22M27 和 [=55 上有值=]M210。函数 sheet.getLastRow() 将包含这些值,您的最​​后一行将是 210.

  2. 如果打印data的值,多了一个空数组

  3. 如果您尝试打印 startRow + i,则值为 22, 23, 24...etc。它只是附加 startRowi 的值而不是算术运算 sum.

解决方案:

  1. 删除不需要的数据或者清理你的sheet这样numRows的值就会变成12.

  2. 既然你跳过了1行,你也应该减去1行到numRow。简单地将 -1 添加到 getRange().

    中的 numRows
  3. 使用parseInt()方法在sheet.getRange((startRow + i), 13).setValue(1);中变量i

您的代码应如下所示:

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();
    }
  }
}

样本:

注意:我将提醒日期值调整为我的当前日期,以便脚本可以运行。

输出:

参考: