开发者问题收集

使用 Google Apps 脚本将手动触发脚本更改为时间驱动触发器

2022-07-26
291

我有一个适用于 Google Sheets 的应用脚本,当我手动触发它时,它会运行,但我希望它由时间驱动,每小时自动运行一次。我尝试使用 Apps Script UI 进行设置,它看起来像这样:

触发器

但我一直收到此错误消息:

异常:无法从此上下文调用 SpreadsheetApp.getUi()。 在未知函数中

我也尝试将时间触发器写入脚本,但一直出现错误。这是当前脚本,当我手动触发它时,它确实可以正常工作。

    var ui = SpreadsheetApp.getUi();
    function onOpen(e){
      
      ui.createMenu("Gmail Manager").addItem("Get Emails by Label", "getGmailEmails").addToUi();
      
    }
    
    function getGmailEmails(){
      var label = GmailApp.getUserLabelByName('EmailsToBeExported');
      var threads = label.getThreads();
      for(var i = threads.length - 1; i >=0; i--){
        var messages = threads[i].getMessages();
        for (var j = 0; j <messages.length; j++){
          var message = messages[j];
          extractDetails(message);
        }
        threads[i].removeLabel(label);
      }
    }
    
    function extractDetails(message){
      var dateTime = message.getDate();
      var subjectText = message.getSubject();
      var senderDetails = message.getFrom();
      var bodyContents = message.getPlainBody();
      
      var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      activeSheet.appendRow([dateTime, senderDetails, subjectText, bodyContents]);
    }`
2个回答

您不能从时间驱动触发器中使用 SpreadsheetApp.getUi()。将触发器更改为:

在此处输入图像描述

TheWizEd
2022-07-26

您还可以通过修改代码来保持可用性:

try {
  const UI = SpreadsheetApp.getUi(); 
} catch (err) {
  const UI = {
    alert: function() {return;},
    prompt: function() {return true;},
    button: {YES: false},
    ButtonSet: {YES_NO: false}
  }
}

您必须手动设置 UI 的参数,但它的作用是让您的代码按预期运行和处理事情。

我特意将提示设置为 true,将按钮设置为 false。这样,如果我检查它们是否等于特定按钮,它将始终评估为 false。

例如

var result = UI.prompt("Some title", "Some question", UI.ButtonSet.YES_NO);
if (result == UI.Button.YES) {//always false
  //This part does not evaluate
}

您必须确保可以在整个脚本中始终如一地执行此操作。您可能希望将值的分配(取决于您的条件语句)更改为字符串、数字或其他唯一内容,或者将条件语句更改为包含“===”等。提示是最棘手的。通过代码中的此更改,您可以在从 Google 表格中运行脚本时获得 UI 提示和警报。当您从外部运行它时,它会跳过它们,例如定时执行或其他会从外部激活您的脚本的事情。

retupmoc258
2023-02-17