Google Apps脚本:服务在短时间内调用了太多次:gmail rateMax。在两次通话之间尝试Utilities.sleep(1000)

时间:2015-05-13 07:06:40

标签: google-apps-script gmail

我编写了以下Google Apps脚本功能,并设置了每日项目触发器,以删除空的Gmail标签:

function removeEmptyGmailLabels() {
  // retrieve all labels
  var labels = GmailApp.getUserLabels();
  for (var i = 0; i < labels.length; i++) {
    // loop over excluded labels and skip them
    for (var j = 0; j < excluded.length; j++) {
      if (labels[i].getName() != excluded[j]) {
        // Utilities.sleep(1000) 
        // retrieve all threads per label
        var threads = labels[i].getThreads();
        // determine if label contains no threads
        if (threads == "") {
          // delete empty label
          labels[i].deleteLabel();
        }
      }
    }
  }
}

此函数会产生以下错误:

enter image description here

从上面的代码中可以看出,我尝试添加Utilities.sleep(1000)但是再次对其进行了评论,因为它没有解决错误。

如何正确使用Utilities.sleep(1000)

1 个答案:

答案 0 :(得分:1)

Utilities.sleep(1000)对你帮助不大,因为传递的时间以毫秒为单位。所以你只是让你的功能睡了1秒钟。并且取决于labelsexcluded的长度以及每个标签与之相关的线程数,这取决于您调用服务的次数。

我还会尝试放置语句来测试它在代码中不同位置的效果。特别是尝试将它放在'labels [i] .getThreads()'语句之后。它会在获取线程和删除标签之间放一秒钟。

仔细查看代码,您的功能似乎不太高效。由于if (labels[i].getName() != excluded[j])遍历代码的其余部分,因此excluded的所有值都与labels[i]不匹配。因此,如果excluded中有10个值,则for循环中包含的代码仍将针对labels[i]不匹配的其他9个值运行。因此,您的“排除”标签仍将最终被删除。我宁愿尝试这样的事情:

for (var i = 0; i < labels.length; i++) {
 var flag = true;
 for (var j = 0; j < excluded.length; j++) {
   if (labels[i].getName() == excluded[j]) {
     flag = false;
    }
  }
 if (flag == true) //Deletes only if there is no match in exceptions
 {
  //Checks only to see whether its empty
  if (labels[i].getThreads() == "") { 
    labels[i].deleteLabel();
   }
  }
 }

尝试这样做,看看是否会降低您的号码。我认为你现在不需要Utilities.sleep(1000)