【问题标题】:Google script stop loop after first match第一次匹配后谷歌脚本停止循环
【发布时间】:2019-07-09 05:37:35
【问题描述】:

我有将列中的日期与今天的日期进行比较并发送电子邮件的脚本。问题是它会为每个比较的单元格发送大量电子邮件。

这是我的代码

function sendEmailAlert3() {

var ss = SpreadsheetApp.openById("ID");
var sheet = ss.getSheetByName("Sheet1");
var sheetname = ss.getSheetByName("Sheet1").getName();
var fValues = sheet.getRange('F2:F20').getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
var user = Session.getActiveUser().getEmail();
var Toemail = 'mail@gmail.com';
var subject = 'Theme - ' + ss.getName();
var body = 'Edited - ' + sheetname + '\nBy - ' + user +
    '\nCheck - ' + ss.getUrl();
var NoEditSubject = 'No ' + ss.getName() + '!';
var NoEditBody = 'No - ' + sheetname +  ss.getUrl();
for (var i = 0; i < fValues.length; i++) {
    var dataday = parseInt(fValues[i][0].getTime()/day)
    Logger.log(dataday+' = '+today)
    if (dataday <= today-5) {MailApp.sendEmail(Toemail,subject, body);}
    else {MailApp.sendEmail(Toemail,NoEditSubject, NoEditBody);}  
    }
}

我需要再添加一个条件,比如next cell == false。

If (dataday &lt;= today-5 || next cell == false) - 对于此条件的第一次匹配需要发送一次电子邮件并停止循环

Else if (dataday &lt;= today-5 || next cell == true) - 对于此条件的第一次匹配需要发送一次电子邮件并停止循环

else - 什么都不做

编辑毕竟回答我的代码看起来像那样(底部):

var dataRange = sheet.getRange(2,7,2,1);
var data = dataRange.getValues();
for (i = 0; i < fValues.length; i++) {
  var dataday = parseInt(fValues[i][0].getTime()/day)
  for (k = 0; k < data.length; k++) {
    Logger.log(dataday)
    if (dataday <= today+5 && data[k][0] == "false") 
    {MailApp.sendEmail(Toemail,subject, body);
          }
  }
}

但它仍然无法正常工作。 我将尝试指定问题所在。

条件是 (dataday

【问题讨论】:

  • 下一个单元格是什么?
  • 我的意思是我的范围是 F2:F20,“下一个单元格”它是下一列 G 上的单元格。

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

您需要做的就是在 if 语句中实现一个 return 语句 - 这将使循环在发送第一封电子邮件后停止。像这样:

 if (dataday <= today-5) {
      MailApp.sendEmail(Toemail,subject, body); 
      return;
    }
    else {MailApp.sendEmail(Toemail,NoEditSubject, NoEditBody);}  

对于您问题的第二部分:如果您命名嵌套循环,则可以退出嵌套循环,然后使用“break”指定要退出的循环,如here 所述:

var i, j;

loop1:
for (i = 0; i < 3; i++) {      //The first for statement is labeled "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   //The second for statement is labeled "loop2"
      if (i === 1 && j === 1) {
         break loop1;
      }
   }
}

【讨论】:

  • 谢谢,它的工作。第二个条件呢?我试过这样for (var i = 0; i &lt; fValues.length; i++) { var dataday = parseInt(fValues[i][0].getTime()/day) for (var j = 0; j &lt; gValues.length; j++) { var datacheck = parseInt(gValues[j][0]) Logger.log(dataday+' = '+today) if (dataday &lt;= today+5 &amp;&amp; datacheck == false) {MailApp.sendEmail(Toemail,subject, body); return;} else {MailApp.sendEmail(Toemail,NoEditSubject, NoEditBody); return;} } }
  • 它对我有用。你放了“return”吗?在“MailApp.sendEmail(Toemail,NoEditSubject,NoEditBody);”之后换行?
  • 是的,回报就是工作。我说的是第二个条件。这是行不通的。
  • 哦,我明白了,您编辑了您的问题并有一个嵌套循环。我会更新我的答案。
  • 嘿,我试过“返回”。在我的情况下它不起作用,因为它在检查第一行后停止。但我需要检查所有范围。我编辑了我的代码。你能看看吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2022-12-05
相关资源
最近更新 更多