谷歌应用脚本:一天内服务调用次数过多:电子邮件

4

我想要循环遍历一个电子表格,对于每一行发送一封电子邮件。一旦发送了电子邮件,我想删除该行。

然而,这并没有起作用。

由于某种原因,它开始疯狂地发送电子邮件,最终达到限制并退出。

实际上,它只删除了一行。

请参见下面的代码:

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

逻辑是,如果有有效的电子邮件,则发送电子邮件并删除该行。 但一旦执行,仅会删除一行,疯狂发送电子邮件,并得到电子邮件最大错误。 你有什么想法吗?

1
在调试模式下测试它。似乎卡在这行代码上:MailApp.sendEmail(sendto, subject, message); 不确定这是否是由于达到了每日限制的原因? - R0b0tn1k
1
尝试使用 getLastRow 而不是 getMaxRow。你可能会得到很多空数据并且在 (sendto!='') 中出现真值转换错误。 - Spencer Easton
谢谢,需要24小时测试。如果有效,我会通知您,以便您编写答案并得分。 - R0b0tn1k
使用类似 var getQuota = MailApp.getRemainingDailyQuota(); 的代码可以查看您还剩下多少封电子邮件。 - James D
1个回答

4

您可以在此处查看每日限制。

关于您的代码,通过执行记录看起来脚本并没有将row识别为整数,而是将其视为字符串,然后再进行转换。因此,您正在删除第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)
    }
 }
}

我希望你能理解这些内容,我不太擅长解释。


完全理解,你说得对!不过我得等到明天才能测试,因为我的电子邮件限制已经用完了。 - R0b0tn1k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接