谷歌脚本一次标记一行

时间:2014-09-24 00:21:42

标签: javascript arrays google-apps-script

我试图以编程方式添加每行的状态。我有一个客户列表,我想使用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

1 个答案:

答案 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行等)