Как уменьшить «компьютерное время», которое использует мой скрипт Google Apps? - PullRequest
3 голосов
/ 26 мая 2019

Я последовал руководству Хьюго Фиерро по добавлению скрипта Google Apps для отправки писем из Google Sheets.Тут на https://developers.google.com/apps-script/articles/sending_emails.

Я настроил скрипт:

1) Я заменил API «MailApp.sendEmail» на «GmailApp.sendEmail», потому что я получал ошибки аутентификации и электронные письмане отправляли.API Gmail работает нормально.

2) Я добавил опцию для отправки вложения в формате PDF с каждым письмом, используя «DriveApp.getFileById».

3) Я добавил второе условие в IFоператор для проверки доступности документа PDF перед отправкой (путем ссылки на столбец на листе).

Проблема заключается в том, что если скрипт ссылается только на 5 строк, он обрабатывается менее чем за 30 секунд.Когда я пытаюсь обработать 10 или более строк, время обработки значительно увеличивается.

Я заменил «sheet.getRange» на «sheet.getLastRow ()», пытаясь уменьшить количество строк, на которые ссылается скрипт.

var READY = 'READY';
var SENT = 'SENT';

function sendEmails() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Email'); // Get the active spreadsheet, then get the "Email" sheet
  var startRow = 2; // Select data row to start at
  var endRow = sheet.getLastRow(); // Get the last row in the sheet
  var data = sheet.getRange(startRow, 1, endRow, 6).getValues(); // Get the range of cells, then get the values

  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var email = row[0]; // Column 1
    var subject = row[1]; // Column 2
    var message = row[2]; // Column 3
    var attachment = DriveApp.getFileById(row[3]); // Returns the attachment file ID
    var emailReady = row[4]; // Column 5
    var emailSent = row[5]; // Column 6
    var name = 'VFISA'; // Set "from" name in email
    var bcc = 'myaddress@gmail.com'; // Blind carbon copy this email address
    if (emailReady==READY && emailSent!==SENT) { // Prevents sending duplicates, waits for attachment cell to confirm available
      GmailApp.sendEmail(email, subject, message,{
        name: name,
        bcc: bcc,
        htmlBody: message,
        attachments: attachment
      });
      sheet.getRange(startRow + i, 6).setValue(SENT); // Set the cell in column F to "SENT"
      SpreadsheetApp.flush(); // Make sure the cell is updated right away in case the script is interrupted
    }
  }
}

Я ожидал, что скрипт будет работать намного быстрее.Я получаю сообщение об ошибке: «Сервис использует слишком много компьютерного времени в течение одного дня».Когда я ссылаюсь на 20 строк, выполнение занимает до 4 минут.

1 Ответ

0 голосов
/ 27 мая 2019

DriveApp.getFileById заставляло каждую строку занимать около 5 секунд. Я удалил это, и теперь весь скрипт выполняется менее чем за 1 секунду.

Вместо добавления PDF в качестве вложения я использовал встроенную ссылку, основанную на идентификаторе файла (согласно предложению Алана Уэллса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...