Ошибка скрипта Google Apps — несколько строк из таблиц Google, но только один файл на диске Google — «итератор достиг конца»

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

У меня есть скрипт, который извлекает поля из таблицы Google, вставляет их в шаблон электронной почты и отправляет электронные письма. Это работает нормально.

Недавно я хотел включить PDF-файл в качестве вложения в электронные письма. Это будет один и тот же PDF-файл для каждого электронного письма. Я загрузил PDF-файл на диск Google. Когда я запускаю скрипт, первое электронное письмо отправляется нормально с вложением, но следующие электронные письма не отправляются, потому что я сталкиваюсь с этой ошибкой: «Не удается получить следующий объект: итератор достиг конца»

Уверен, что это связано с вложением / файлом, и я неправильно обрабатываю итерацию. Кто-нибудь может помочь? Ниже приведен код:

 function send2Email()
{
  var filename= 'even_overview2020.pdf';
  var file = DriveApp.getFilesByName(filename);
  
  var spread         =SpreadsheetApp.getActiveSpreadsheet();
  var contactSheet   =spread.getSheetByName(contactSheetName);
  var bodySheet      =spread.getSheetByName(templateSheetName);
  var contactData    =contactSheet.getDataRange().getValues();
  var bodyData       =bodySheet.getDataRange().getValues();
  var fname,company,sign,template,email,subject,body,sender,file;
  for (var i =1;i<contactData.length;i  )

  {
    contactData[i][statusCol-1]="";
  }
  contactSheet.getDataRange().setValues(contactData);
  for (var i =1;i<contactData.length;i  )
  {
    fname=trim_(contactData[i][fnameCol-1]);
    company=trim_(contactData[i][companyCol-1]);
    sign=trim_(contactData[i][signCol-1]);
    template=trim_(contactData[i][templateCol-1]);
    email=trim_(contactData[i][emailCol-1]);
    sender=trim_(contactData[i][senderCol-1]);
    Logger.log(email);
    for(var j=1;j<bodyData.length;j  )
    {
      if(trim_(bodyData[j][tempRefCol-1]).toUpperCase()==String(template).toUpperCase())
      {
        body=bodyData[j][bodyCol-1];
        subject=bodyData[j][subjectCol-1];
      }
    }
    Logger.log(j "," email ',' body ',' subject);
    body=body.replace(/n/g,"<br>");
    body=body.replace("(w)",sign).replace("(x)",fname).replace("(y)",company).replace("(s)",sender.split(" ")[0]);
    Logger.log(email ',' body ',' subject);

    
    MailApp.sendEmail({to:email,subject:subject,name:sender,htmlBody:body,attachments: [file.next().getAs(MimeType.PDF)]});
    contactSheet.getRange(i 1, statusCol).setValue('Y');
  }
}
  

Ответ №1:

Как насчет этой модификации?

Точка изменения:

  • В вашем скрипте attachments: [file.next().getAs(MimeType.PDF)]} используется в цикле. Таким образом, 1-й цикл работает file.next() . Но после 2-го цикла возникает ошибка в, file.next() потому что файл filename является одним файлом на диске Google. Я думаю, что это причина вашей проблемы.

Чтобы избежать этой проблемы, как насчет следующего изменения?

Измененный скрипт:

От:

 var file = DriveApp.getFilesByName(filename);
  

Для:

 var files = DriveApp.getFilesByName(filename);
var file;
if (files.hasNext()) {
  file = files.next().getAs(MimeType.PDF);
} else {
  throw new Error("No file");
}
  

А также, пожалуйста, измените следующим образом.

От:

 MailApp.sendEmail({to:email,subject:subject,name:sender,htmlBody:body,attachments: [file.next().getAs(MimeType.PDF)]});
  

Для:

 MailApp.sendEmail({to:email,subject:subject,name:sender,htmlBody:body,attachments: [file]});
  

Ссылка:

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

1. Большое вам спасибо за вашу помощь! Это сработало отлично. Я действительно ценю, что вы нашли время, чтобы помочь мне.

2. @Eric Chen Спасибо за ответ. Я рад, что ваша проблема была решена. Вам тоже спасибо.