功能通过菜单或手动工作 运行 - 但不使用 Google 时间事件

Functions work from menu or manually run - but not using Google Time Event

我有两个功能- - 第一个收到电子邮件 - getEmails(); - 第二个删除我的垃圾箱 - deleteForever();

a) 我创建了一个自定义菜单来分别触发上述功能并且它们都起作用。 b) 测试后我添加了一个 Google Project Trigger using Timed Event

getEmails 函数停止工作正常。 当 运行 时,脚本没有错误 & 结果是:

  1. 数据插入工作表<- 这样做的原因POST-这从来没有发生过
  2. 电子邮件移至垃圾箱 getEmails(); <- 成功 - 我亲眼看到了
  3. 电子邮件删除 w/ deleteForever(); <- 成功-我亲眼看到了

环境变化:我测试了何时在浏览器中打开和关闭电子表格和 gmail

FIX 尝试:我使用了 getActiveSheet() * 注意它已将其注释掉 * 并替换为实际的电子表格 ID,认为这有助于解决我的问题,但结果相同。

有什么想法吗?

函数 1 -(不适用于项目触发器定时事件,但可以手动执行)

function getEmails() {

   /*var ss = SpreadsheetApp.getActiveSheet();*/
    var ss = SpreadsheetApp.openById("1Y-MY-SPREADSHEET-ID-8q9q98k");
    var threads = GmailApp.search("is:starred in:WebOppCRM");
    var row = ss.getLastRow();   

for (var i=0; i<threads.length; i++) {

 /* COMMENT OUT TO FOCUS ON PURPOSE OF QUESTION  
 var start = new Date();
    if (isTimeUp_(start)) {
    Logger.log("Time up");
    break;
  }
  */
    var messages = threads[i].getMessages();
    var newrow = row + 1;

    for (var j=0; j<messages.length; j++) {
        var msg = messages[j].getPlainBody();
        var dat = messages[j].getDate();
        var msgParse ='=SPLIT($A'+ (newrow) + ', "|")';
        ss.appendRow([msg, dat, msgParse]);
        newrow = newrow +1;
      Utilities.sleep(100);// pause in the loop for 200 milliseconds
    }
    threads[i].moveToTrash();
  }

函数 2 - 与项目触发器或手动一起工作

function deleteForever() {
  var threads = GmailApp.search("in:trash");
  for (var i = 0; i < threads.length; i++) {
    Gmail.Users.Messages.remove("tannerfasteners@gmail.com", threads[i].getId());
  } 
}

您缺少此功能。它在这里工作,也有一个时间驱动的触发器。

function isTimeUp_(start) {
  var now = new Date();
  return now.getTime() - start.getTime() > 300000; // alert above 3 minutes, to keep it under 5 minutes
}

我真的宁愿接受另一个人的回答,但是上面没有任何内容甚至没有解决我具体列出的问题。

答案是在没有被我打开的时候把重点放在具体的sheet上

我意识到了

  1. 代码在脚本顶部执行
  2. 正在执行以下代码和函数
  3. 脚本没有指示 Sheet 使用什么

现在也很明显 - 从

移动时
var ss = SpreadsheetApp.getActiveSheet();

以下内容并关闭 sheet

 var ss = SpreadsheetApp.openById("-My-Sheet-ID-Removed-");

如果不知道要写入什么sheet,就无法写入数据。

修改我的脚本并添加下面标记为 /SOLUTION>/ 的行以设置活动 sheet

              var ss = SpreadsheetApp.openById("-My-ID-Here"); 
/*SOLUTION>*/  SpreadsheetApp.setActiveSheet(ss.getSheetByName('data'))
              var threads = GmailApp.search("is:starred in:WebOppCRM");
              var row = ss.getLastRow(); 

这解决了我的具体问题和问题,即为什么它在 sheet 打开时有效(因为 sheet 因我在上面而处于活动状态)但在 [=43= 时部分停止] 已关闭(因为 sheet 显然不再有效)

希望这可以节省一些调试时间。