javascript - Google Apps 脚本 : Service invoked too many times for one day: email

标签 javascript for-loop debugging google-apps-script google-sheets

我正在尝试遍历电子表格,并为每一行发送一封电子邮件。发送电子邮件后,我想删除该行。

然而,这是行不通的。

出于某种原因,它开始疯狂地发送电子邮件,并在某个时候达到限制并退出。

它实际上只删除了一行。

请看下面的代码:

function sendEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var startRow = 2;  // First row of data to process
  var maxRows = sheet.getMaxRows();

  var range = sheet.getRange(startRow, 1, maxRows, 50)
  var values = range.getValues();

 for (var row in values) {
     Logger.log('ID=' + values[row][0]);
     var theID = values[row][0];
     var message = "";
     var sendto = "";
     var emailAddress = values[row][2];
     if (emailAddress=="Autre"){sendto="test@test.com"}
     if (emailAddress=="Autre1"){sendto="test1@test.com"}
     if (emailAddress=="Autre2"){sendto="test2@test.com"}
    message+="\n ID: " + values[row][1];
    message+="\n Project Number: " + values[row][2];

    var subject = "Project ID: " + values[row][1];

   if (sendto!=''){
     MailApp.sendEmail(sendto, subject, message);
     sheet.deleteRow(row+2)
    }
 }

逻辑是,如果有有效的电子邮件,发送电子邮件,删除行。

但是一旦执行,它只会删除一行,发疯似地发送电子邮件,并得到电子邮件最大错误。

想法?

最佳答案

您可以查看每日限额here .

关于您的代码,查看执行记录,脚本似乎无法识别 row作为一个整数但作为一个字符串,它附加 2 然后才转换它。所以你要删除第 2 行(或 02),然后是第 12 行,然后是第 22 行,依此类推。

但是,这无关紧要,因为您的逻辑存在问题。我会尽力解释它,并希望它是可以理解的。

如果您在每次迭代后删除一行,那么在第一次迭代中它将删除第 2 行(因为 row = 0 并且您添加了 2),在第二次迭代中它将删除第 3 行(因为 row = 1 并且您添加了 2),但是由于在您的第一次迭代中您已经删除了一行,所以一开始位于第 3 行的数据现在实际上位于第 2 行。

解决这个问题的一种方法是反转循环,从最大值开始倒计时。这样,当您删除一行时,它对下一行没有影响。我已经稍微改写了您的代码,以便它可以按预期工作。

function sendEmails() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var startRow = 2;  // First row of data to process
  var lastRow = sheet.getLastRow(); // getLastRow() gives you the last row that has content, while getMaxRows gives you the maximum number of rows in your sheet
  var range = sheet.getRange(startRow, 1, lastRow-1, 50)  // -1 because you want the number of rows from your starting position and not the index of the last row
  var values = range.getValues();

 for (row = values.length-1; row >= 0; row--) { 
     var theID = values[row][0];
     var message = "";
     var sendto = "";
     var emailAddress = values[row][2];
     if (emailAddress=="Autre"){sendto="test@test.com"}
     if (emailAddress=="Autre1"){sendto="test1@test.com"}
     if (emailAddress=="Autre2"){sendto="test2@test.com"}
    message+="\n ID: " + values[row][1];
    message+="\n Project Number: " + values[row][2];

    var subject = "Project ID: " + values[row][1];

   if (sendto!=''){
     MailApp.sendEmail(sendto, subject, message);
     sheet.deleteRow(row+2)
    }
 }
}

我希望这有点可以理解,我不太擅长解释事情。

关于javascript - Google Apps 脚本 : Service invoked too many times for one day: email,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42068737/

相关文章:

javascript - 比较数组中的相邻元素并选择每对中较小的一个

r - 在 R 中使用 for 循环将多个图像(3D 数组)存储到 4D 数组中

javascript - 当我们在 react-google-maps 中点击圆圈时如何显示信息窗口

javascript - 如何禁用用户选中的默认复选框以取消选中

javascript - 如何使用 chart.js 仅绘制图形和 X 轴网格线

javascript - 从表单构建 FormData 对象

python - for 循环有 7 个值可以滚动,但我得到 8 个输出

c# - 错误 "Unable to evaluate the expression"

asp.net - 调试:当类型标记为可序列化时如何调试 "Type is not marked as serializable"异常

.net - 在Visual Studio的监 window 口中自动刷新