#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 Спасибо за ответ. Я рад, что ваша проблема была решена. Вам тоже спасибо.