【问题标题】:Change from manually triggered script to time-driven trigger using Google Apps script使用 Google Apps 脚本从手动触发的脚本更改为时间驱动的触发器
【发布时间】:2023-02-18 00:54:35
【问题描述】:

我有一个用于 Google 表格的应用程序脚本,当我手动触发它时它可以工作,但我希望它是时间驱动的,每小时自动运行一次。我尝试使用 Apps Script UI 进行设置,它看起来像这样:

Trigger

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

异常:无法从此上下文调用 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]);
    }`

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议。我更改了触发器以选择函数 getGmailEmails,但仍然出现类似的错误,这似乎表明它继续尝试使用 SpreadsheetApp.getUi。这是我在进行建议更改后收到的错误消息:异常:无法从此上下文调用 SpreadsheetApp.getUi()。在 [未知功能](代码:1:25)
    • 这可能是因为var ui = SpreadsheetApp.getUi(); 在全局空间中,它在任何函数运行时运行。我会把它从项目中完全删除
    • 并确保您删除了旧的时间驱动触发器 onEdit()
    • 这一切都奏效了。谢谢。
    【解决方案2】:

    您还可以通过像这样更改代码来保持可用性:

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

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

    我特意将提示设为真,将按钮设为假。这样,如果我检查它们是否等于特定按钮,它将始终评估为 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 提示和警报,并且当您从外部运行它时,它会跳过它们,例如定时执行或其他会激活您的脚本的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多