【问题标题】:I can't get Google Apps Script run for my Gmail我无法为我的 Gmail 运行 Google Apps 脚本
【发布时间】:2021-01-16 22:27:08
【问题描述】:

我按照Any way to send Gmail auto-response at certain times every week? 中发布的脚本进行操作。但是,根据我当前的测试,我的 Gmail 帐户在下班时间没有回复任何消息。

我做错了什么或不完整?

我做了什么:

  1. 通过复制和粘贴在https://script.google.com/ 上创建了一个脚本。
  2. 已保存脚本并对其进行了测试。它工作得很好。 enter image description here
function myFunction() {
  function autoReply() {
var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([4,5,6,0].indexOf(day) > -1 || (day == 1 && hour < 9) || (day == 3 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      if (threads[i].isUnread()){
      threads[i].reply("xxxx");
      threads[i].markRead();
      threads[i].markImportant();
      }
    }
  }
}
}
  1. 通过“高级 Google 服务”菜单启用 Gmail API enter image description here
  2. 为脚本设置一个触发器,每 5 分钟一次。 enter image description here
  3. 从另一个 Gmail 帐户发送了几封测试电子邮件,看看是否会有任何自动回复。
  4. 没有手动修改任何从其他帐户收到的电子邮件。

任何提示将不胜感激!

更新:我想知道为什么下面的脚本本身会导致“找不到脚本函数:myFunction”错误?

function autoReply() {
  
  // find calendar event
  var today = new Date();
  var events = CalendarApp.getDefaultCalendar().getEventsForDay(today, { search: 'OOF' });
  var unavailableToday = false;
  for (var i = 0; i < events.length; i++) {
    
    if(events[i].isAllDayEvent() && events[i].isOwnedByMe()) {
      
      unavailableToday = true;
      break;
      
    }
    
  }
  
  var myEmail = Session.getEffectiveUser().getEmail();
  
  Logger.log('unavailableToday');
  Logger.log(unavailableToday);
  if(unavailableToday === true) {
    
    // get html message
    var files = DriveApp.getRootFolder().getFilesByName('autoreply.html');
    var htmlbody;
    while (files.hasNext()) {
      var file = files.next();

      htmlbody = file.getBlob().getDataAsString('utf8');
      
    }
   
    // get emails
    var interval = 2;
    var date = new Date();
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox !label:autoresponded after:' + timeFrom);
    var label = GmailApp.getUserLabelByName("autoresponded");

    for (var i = 0; i < threads.length; i++) {
      
      var message = threads[i].getMessages()[0];
      if (message.getFrom().indexOf(myEmail) < 0 && message.getFrom().indexOf("no-repl") < 0 && message.getFrom().indexOf("bounce") < 0 && message.getFrom().indexOf("spam") < 0) {
        
        Logger.log("Replied now");
        
        // reply
        threads[i].reply("", {
          htmlBody: htmlbody
        });
        
        // label
        label.addToThread(threads[i]);
        
      }
      
    }
    
  }
  
}

是什么让我认为 MyFunction{} 是必不可少的?

【问题讨论】:

  • 请包含您的实际代码而不是图片。
  • 嗨,我已经用代码编辑了我的帖子。我替换了自动回复部分,因为它包含个人信息。

标签: google-apps-script google-api gmail gmail-api


【解决方案1】:

答案:

您需要删除myFunction() 之外的autoReply() 函数并在autoReply() 上设置触发器。

更多信息:

代码应该与您链接的答案中的代码相同:

function autoReply() {
  var interval = 5;    //  if the script runs every 5 minutes; change otherwise
  var date = new Date();
  var day = date.getDay();
  var hour = date.getHours();
  if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
    var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
    var threads = GmailApp.search('is:inbox after:' + timeFrom);
    for (var i = 0; i < threads.length; i++) {
      threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
    }
  }
}

不是这样的:

function myFunction() {
  function autoReply() {
    var interval = 5;    //  if the script runs every 5 minutes; change otherwise
    var date = new Date();
    var day = date.getDay();
    var hour = date.getHours();
    if ([5,6,0].indexOf(day) > -1 || (day == 1 && hour < 8) || (day == 4 && hour >= 17)) {
      var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
      var threads = GmailApp.search('is:inbox after:' + timeFrom);
      for (var i = 0; i < threads.length; i++) {
        threads[i].reply("I am out of office. Your email will not seen until Monday morning.");
      }
    }
  }
}

当您调用myFunction() 时,不会调用autoReply(),只是声明了。

您需要编辑代码,然后重新设置触发器以在 autoReply() 上运行。

来自w3schools

声明的函数不会立即执行。它们被“保存以备后用”,并在稍后被调用(调用)时执行。

参考资料:

【讨论】:

  • 谢谢。我包含 myFunction 的原因是删除它会导致另一个脚本停止运行:webapps.stackexchange.com/a/143228 并且错误代码是“找不到脚本函数:myFunction”,所以作为一个编码新手,我认为 myFunction{} 是强制性的? @Rafa Guillermo
  • 你能看看我也更新的另一个案例吗?或者我需要提出一个新问题?
  • @AlecSandy 在堆栈溢出的正常情况下,您应该接受回答您的问题并提出新问题的答案,而不是在提供答案后编辑您的问题。然而,正如我在回答中所说,您需要更新您的触发器,因为它仍在尝试运行myFunction()。返回触发器页面并编辑触发器,以便在Choose which function to run 下选择autoReply
  • 再次感谢。我在这里列出另一个的原因是因为它让我对 MyFunction 有一些错误的理解{}
  • @AlecSandy 我建议查看一些 Apps 脚本基础知识,here 是一个帮助您入门的链接 :)
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多