【问题标题】:Google Apps Script - Time Based TriggerGoogle Apps 脚本 - 基于时间的触发器
【发布时间】:2020-08-21 17:35:25
【问题描述】:

我是个新手,正在尝试设置定时触发器。我有一个包含电子邮件列表的电子表格,创建了一个脚本,可以向每个人发送一封电子邮件。如果我手动运行脚本,它工作得很好。我想要一个每 3 个月自动发送电子邮件的触发器。

function sendEmails() {
  var ss = SpreadsheetApp.openById("1234ID-here"); SpreadsheetApp.setActiveSpreadsheet(ss);
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getDataRange(); // Fetch values for each row in the Range.  var data = dataRange.getValues();
  for (var i = 1; i < data.length; i++) {
    (function (val) {
      var rowData = data[i];
      var emailAddress = rowData[1];
      var recipient = rowData[0];
      var phone = rowData[2];
      var skill = rowData[3];
      var address = rowData[4];
      var moreinfo = rowData[5];
      var message = 'Dear ' + recipient + ',\n\n' + "You signed up for the following skillshare:" + skill + "." +
        "If you would like to be removed from this list, or if the following contact info has changed, please reply to this email. Otherwise we will assume no change." +
        '\n\n' + address + '\n\n' + phone + '\n\n' + moreinfo + '\n\n' + 'Thanks!';
      var subject = 'Skill sharing list';
      MailApp.sendEmail(emailAddress, subject, message);
    })(i);
  }
}

如果我运行它,它工作正常。这是我为触发器创建的另一个脚本:

function createTimeTriggers() {
  ScriptApp.newTrigger('sendEmails')
    .timeBased()
    .everyMinutes(1) //(to test it)
    .create();
}

运行它对我没有任何帮助,看起来它有 90% 的错误率,我一运行它就执行了 119 次。请帮忙?

*编辑 - 看起来它记录了错误“找不到脚本函数:sendEmails”

【问题讨论】:

    标签: google-apps-script triggers


    【解决方案1】:

    就像我说的,新手(比如,我昨晚刚开始学习这个)。我想到了!我已经将脚本创建为两个独立的项目,但刚刚意识到我可以将脚本添加到我的 sendEmails 项目中......现在两个脚本都包含在一个项目中,它运行得非常好!哈哈,感谢您的帮助和耐心!

    【讨论】:

      【解决方案2】:

      您创建基于时间的触发器的代码看起来是正确的。如果它有效,您应该能够在以下位置看到您的触发器:https://script.google.com/home/triggers

      我猜这个问题可能与您使用 SetActiveSheet/getActiveSheet 有关,这似乎是不必要的,并且在从触发器的上下文中运行时可能会导致意外问题或崩溃。

      工作表不需要处于活动状态才能从代码中访问它们,在此上下文中的“活动”与用户界面相关。

      尝试显式访问工作表和电子表格,而不是该代码:

      var sheet = SpreadsheetApp.openById("1234ID-here").getSheetByName("Sheet1");
      var dataRange = sheet.getDataRange(); // Fetch values for each row in the Range. 
      ...
      

      【讨论】:

      • 我确实在触发器中看到了它。更改了代码,删除了触发器,然后再次运行......仍然没有骰子。相同的高错误=/
      【解决方案3】:

      为什么使用基于时间的触发器会以不同方式运行

      function sendEmails() {
        var ss = SpreadsheetApp.openById("1234ID-here");  
        SpreadsheetApp.setActiveSpreadsheet(ss);
        var sheet = SpreadsheetApp.getActiveSheet();
      

      当您在用户界面打开时运行上述函数时,无论打开什么电子表格,它都可以正常运行,但是当从基于时间的触发器运行时,它总是在服务器上运行,没有打开用户界面,它选择活动工作表为 @ 987654322@ 这是电子表格中最左边的工作表。

      所以@Cameron Roberts 解决方案可以正常工作,我只是想让你知道为什么它不适合你。

      【讨论】:

      • 谢谢,我确实做了这些更改,但我仍然收到错误消息“找不到脚本函数:sendEmails”。
      • 也许你不止一个名为 sendEmails() 的函数
      • 请分享确切的信息。
      • 脚本保存了吗?
      • 如果您手动创建了脚本,您将不得不选择名称,如果有两个 if 会警告您,所以大概您在代码中创建了触发器,所以您一定是把它命名错了。里面有多余的空格吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多