#google-apps-script #google-api #gmail #gmail-api
#google-apps-script #google-api #gmail #gmail-api
Вопрос:
Я каким-либо образом следовал сценарию, опубликованному для отправки автоответчика Gmail в определенное время каждую неделю?. Однако моя учетная запись Gmail не ответила ни на одно сообщение в нерабочее время в соответствии с моим текущим тестом.
Я сделал что-то неправильное или неполное?
Что я сделал:
- Создал скрипт на https://script.google.com / с помощью копирования и вставки.
- Сохранил скрипт и протестировал его. Это сработало нормально. введите описание изображения здесь
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();
}
}
}
}
}
- Включил API Gmail через меню «Дополнительные сервисы Google»
введите описание изображения здесь - Настройте триггер для скрипта каждые 5 минут. введите описание изображения здесь
- Отправил несколько тестовых электронных писем с другой учетной записи Gmail, чтобы узнать, будет ли какой-либо автоответчик.
- Не изменял вручную полученные электронные письма с другой учетной записи.
Любые подсказки будут очень оценены!
Обновление: интересно, почему сам следующий скрипт приведет к ошибке «Функция скрипта не найдена: 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 Я предлагаю ознакомиться с некоторыми основами скриптов приложений, вот ссылка, чтобы вы начали 🙂