我试图以编程方式添加每行的状态。我有一个客户列表,我想使用Google Script发送一些电子邮件。
我的问题是为什么它没有到达最后一排?
我的代码如下:
function sendEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = ss.getSheetByName(SHEET_NAME);
var dataRange = dataSheet.getRange(2, 1, dataSheet.getMaxRows() - 1, 4);
var templateSheet = ss.getSheetByName(TEMPLATE_SHEET_NAME);
var emailSubject = templateSheet.getRange(EMAIL_SUBJECT_CELL_RANGE).getValue();
var emailTemplate = templateSheet.getRange(EMAIL_TEMPLATE_CELL_RANGE).getValue();
// Create one JavaScript object per row of data.
objects = getRowsData(dataSheet, dataRange);
// For every row object, create a personalized email from a template and send
// it to the appropriate person.
for (var i = 1; i < objects.length; ++i) {
// Get a row object
var rowData = objects[i];
//Logger.log(rowData.status);
// Generate a personalized email.
// Given a template string, replace markers (for instance ${"First Name"}) with
// the corresponding value in a row object (for instance rowData.firstName).
var emailText = fillInTemplateFromObject(emailTemplate, rowData);
var msgPlain = emailText.replace(/(<([^>]+)>)/ig, ""); // clear html tags for plain mail
if (rowData.status == EMAIL_NOT_SENT) {
//MailApp.sendEmail(rowData.email, emailSubject, msgPlain, { htmlBody: emailText });
var statusCell = dataSheet.getRange(i+1,4,1);
if (!isCellEmpty(statusCell) && statusCell.getValue() != STATUS_COLUMN_NAME) {
Logger.log(statusCell.getA1Notation());
Logger.log(objects.length);
//statusCell.setValue(EMAIL_SENT);
}
}
}
}
记录输出:
[14-09-24 03:17:45:161 EEST] D2
[14-09-24 03:17:45:162 EEST] 5.0
[14-09-24 03:17:45:166 EEST] D3
[14-09-24 03:17:45:166 EEST] 5.0
[14-09-24 03:17:45:170 EEST] D4
[14-09-24 03:17:45:170 EEST] 5.0
[14-09-24 03:17:45:173 EEST] D5
[14-09-24 03:17:45:174 EEST] 5.0
答案 0 :(得分:2)
这一行:
for (var i = 1; i < objects.length; ++i) {
从1迭代到4(因为object.length = 5),因为对象属性(如数组)被索引为0。
工作表方法(如getRange()
)从1开始计数(没有第0行)所以当你使用
var statusCell = dataSheet.getRange(i+1,4,1);
您的目标是错误的行(相应数据上方的行)。
您可以使用
非常简单地解决该问题 var statusCell = dataSheet.getRange(i+2,4,1);
+1来补偿索引差异,+1来跳过标题。
你可以通过记录i的值(显示1,2,3,4)和rowData的相应属性来轻松找到这个(i = 1的rowData是表格第3行,i = 2的rowData是表格第4行等)