Скрипт Google Apps - запуск по времени - PullRequest
0 голосов
/ 06 мая 2020

Я полный новичок, пытаюсь настроить триггер по времени. У меня есть электронная таблица со списком электронных писем, я создал сценарий, который будет отправлять электронное письмо каждому из них. Если я запускаю сценарий вручную, он работает нормально. Мне нужен триггер, который будет автоматически отправлять электронные письма каждые 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 выполнениях, как только я его запустил. Помогите, пожалуйста?

* Редактировать - похоже, что в журнале появилась ошибка «Script function not found: sendEmails»

Only have the two scripts

sendEmails snippet

trigger snippet

error

the one trigger I'm trying to add

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Как я уже сказал, новичок (например, я только начал изучать это вчера вечером). Я понял! Я создал сценарии как два отдельных проекта, но только что понял, что могу добавить сценарий в свой проект sendEmails .... и теперь, когда оба сценария содержатся в одном проекте, он отлично работает! Ха-ха, спасибо за помощь и терпение!

0 голосов
/ 06 мая 2020

Почему он работает по-другому с триггером, основанным на времени

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

Когда вы запускаете вышеуказанную функцию при открытом пользовательском интерфейсе, она работает нормально из любой открытой электронной таблицы, но когда она запускается из синхронизированного по времени триггера он всегда работает на сервере без открытого пользовательского интерфейса и выбирает активный лист как ss.getSheets()[0], который является крайним левым листом в электронной таблице.

Итак, решение @Cameron Roberts будет работать нормально Я просто хотел, чтобы вы знали, почему это не сработало для вас.

0 голосов
/ 06 мая 2020

Ваш код для создания триггера на основе времени выглядит правильно. Если это сработало, вы должны увидеть свои триггеры по адресу: https://script.google.com/home/triggers

Я предполагаю, что проблема может быть связана с использованием вами SetActiveSheet / getActiveSheet, который кажется ненужным и может приводить к непреднамеренным проблемам или ошибке sh при запуске из контекста триггера.

Таблицы не должны быть активными, чтобы вы могли получить к ним доступ из вашего кода, «активны» в этом контексте имеет отношение к пользовательскому интерфейсу.

Вместо этого кода попробуйте явно получить доступ как к листу, так и к электронной таблице:

var sheet = SpreadsheetApp.openById("1234ID-here").getSheetByName("Sheet1");
var dataRange = sheet.getDataRange(); // Fetch values for each row in the Range. 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...