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 和脚本中存在一些问题。
在您的示例 sheet 中,您在 M22、M27 和 [=55 上有值=]M210。函数 sheet.getLastRow()
将包含这些值,您的最后一行将是 210.
如果打印data的值,多了一个空数组
如果您尝试打印 startRow + i
,则值为 22, 23, 24...etc
。它只是附加 startRow
和 i
的值而不是算术运算 sum.
解决方案:
删除不需要的数据或者清理你的sheet这样numRows
的值就会变成12.
既然你跳过了1行,你也应该减去1行到numRow。简单地将 -1 添加到 getRange()
.
中的 numRows
使用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();
}
}
}
样本:
注意:我将提醒日期值调整为我的当前日期,以便脚本可以运行。
输出:
参考:
我在链接到 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 和脚本中存在一些问题。
在您的示例 sheet 中,您在 M22、M27 和 [=55 上有值=]M210。函数
sheet.getLastRow()
将包含这些值,您的最后一行将是 210.如果打印data的值,多了一个空数组
如果您尝试打印
startRow + i
,则值为22, 23, 24...etc
。它只是附加startRow
和i
的值而不是算术运算 sum.
解决方案:
删除不需要的数据或者清理你的sheet这样
numRows
的值就会变成12.既然你跳过了1行,你也应该减去1行到numRow。简单地将 -1 添加到
中的 numRowsgetRange()
.使用
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();
}
}
}
样本:
注意:我将提醒日期值调整为我的当前日期,以便脚本可以运行。
输出: