Я не могу запустить скрипт Google Apps для моего Gmail

#google-apps-script #google-api #gmail #gmail-api

#google-apps-script #google-api #gmail #gmail-api

Вопрос:

Я каким-либо образом следовал сценарию, опубликованному для отправки автоответчика Gmail в определенное время каждую неделю?. Однако моя учетная запись Gmail не ответила ни на одно сообщение в нерабочее время в соответствии с моим текущим тестом.

Я сделал что-то неправильное или неполное?

Что я сделал:

  1. Создал скрипт на https://script.google.com / с помощью копирования и вставки.
  2. Сохранил скрипт и протестировал его. Это сработало нормально. введите описание изображения здесь
 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 amp;amp; hour < 9) || (day == 3 amp;amp; 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. Включил API Gmail через меню «Дополнительные сервисы Google»
    введите описание изображения здесь
  2. Настройте триггер для скрипта каждые 5 минут. введите описание изображения здесь
  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() amp;amp; 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 amp;amp; message.getFrom().indexOf("no-repl") < 0 amp;amp; message.getFrom().indexOf("bounce") < 0 amp;amp; message.getFrom().indexOf("spam") < 0) {
        
        Logger.log("Replied now");
        
        // reply
        threads[i].reply("", {
          htmlBody: htmlbody
        });
        
        // label
        label.addToThread(threads[i]);
        
      }
      
    }
    
  }
  
}
  

Что заставило меня подумать, что myFunction{} имеет важное значение?

Комментарии:

1. пожалуйста, укажите ваш фактический код, а не изображения.

2. Привет, я отредактировал свой пост с помощью кода. Я заменил часть автоответчика, поскольку она содержит личную информацию.

Ответ №1:

Ответ:

Вам нужно удалить autoReply() функцию за пределами myFunction() и включить триггер 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 amp;amp; hour < 8) || (day == 4 amp;amp; 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 amp;amp; hour < 8) || (day == 4 amp;amp; 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.");
      }
    }
  }
}
  

autoReply() не вызывается при вызове myFunction() , только объявляется.

Вам нужно будет отредактировать код, а затем заново настроить триггер для запуска autoReply() .

Из w3schools:

Объявленные функции выполняются не сразу. Они «сохраняются для последующего использования» и будут выполнены позже, когда они будут вызваны (вызваны).

Ссылки:

Комментарии:

1. Спасибо. Причина, по которой я включил myFunction, заключалась в том, что ее удаление приведет к остановке запуска другого скрипта: webapps.stackexchange.com/a/143228 и код ошибки — «Функция скрипта не найдена: myFunction», так что, будучи новичком в программировании, я думал, что myFunction{} обязательна?? @Рафа Гильермо

2. Не могли бы вы взглянуть на другой случай, который я тоже обновил? Или мне нужно задать новый вопрос?

3. @AlecSandy В обычных обстоятельствах при переполнении стека вы должны принять ответ, который отвечает на ваш вопрос, и задать новый вопрос, а не редактировать свой вопрос после предоставления ответов. Однако, как я уже сказал в своем ответе, вам необходимо обновить свой триггер, поскольку он все еще пытается запуститься myFunction() . Вернитесь на страницу триггера и отредактируйте триггер так, Choose which function to run чтобы он был выбран вами autoReply .

4. Еще раз спасибо. Причина, по которой я перечислил здесь еще один, заключается в том, что это заставило меня неправильно понять myFunction{}

5. @AlecSandy Я предлагаю ознакомиться с некоторыми основами скриптов приложений, вот ссылка, чтобы вы начали 🙂