【问题标题】:Google Apps Script: Service invoked too many times for one day: emailGoogle Apps 脚本:一天内服务调用次数过多:电子邮件
【发布时间】:2017-06-23 10:49:27
【问题描述】:

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

但是这行不通。

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

实际上只删除了一行。

请看下面的代码:

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

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

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

想法?

【问题讨论】:

  • 在调试模式下测试。好像卡在了线上:MailApp.sendEmail(sendto, subject, message);不知道是不是因为涨停了?
  • 尝试getLastRow 而不是getMaxRow。您可能会收到大量空白数据并使用(sendto!='') 获得真实的转换错误
  • 谢谢,需要 24 小时才能测试。如果有效,我会通知您,以便您写下答案并得分。
  • 使用类似: var getQuota = MailApp.getRemainingDailyQuota();查看您还剩下多少封电子邮件。

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


【解决方案1】:

您可以查看每日限额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)
    }
 }
}

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

【讨论】:

  • 完全理解,你完全正确!不过,我必须等到明天才能测试它,因为我的电子邮件限制已经用完了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2020-12-15
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多