#google-apps-script #google-sheets
Вопрос:
Я столкнулся с проблемой в этом коде при отправке определенного листа Google (по электронной почте) в качестве вложения Excel.
function sendReport() {
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data").hideSheet();
var message = {
to: "email@domain.com",
subject: "Weekly Reports",
body: "Hi Team,nnPlease find attached summary reports, Thanks!nnThank you,nMyNameHere",
name: "MyNameHere",
attachments: [SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EMAIL").getAs(MimeType.xlsx).setName("Weekly Report")]
}
MailApp.sendEmail(message);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EMAIL").activate();
}
Ошибка, с которой я сталкиваюсь, заключается в:
8:36:26 PM Notice Execution started
8:36:27 PM Error TypeError: SpreadsheetApp.getActiveSpreadsheet(...).getSheetByName(...).getAs is not a function
sendReport @ script.gs:10
после удаления
.getSheetByName("EMAIL")
из строки номер 10 ошибка выглядит следующим образом:
8:38:43 PM Notice Execution started
8:38:43 PM Error Exception: Invalid argument
sendReport @ script.gs:10
Комментарии:
1. У меня мало знаний о написании сценариев приложений, так как я только начал работать… Поэтому, пожалуйста, не обращайте внимания, если я совершил ошибку, и помогите, пожалуйста, спасибо!
2. Также я хотел бы отметить, что код отлично работает, если я изменю .getAs(MimeType.xlsx) в .getAs(MimeType.PDF)
Ответ №1:
Причина, по которой вы столкнулись с такой ошибкой, заключается в том getAs()
, что объекта in Sheet нет.
Вы можете обратиться к этому образцу кода о том, как прикрепить определенный лист в виде файла excel в своей электронной почте:
var url = "https://docs.google.com/spreadsheets/d/" SpreadsheetApp.getActiveSpreadsheet().getId() "/export"
"?format=xlsxamp;"
"gid=" SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EMAIL").getSheetId();
var params = {method:"GET",headers:{"authorization":"Bearer " ScriptApp.getOAuthToken()}};
var blob = UrlFetchApp.fetch(url, params).getBlob().setName("Weekly Report.xlsx");
var message = {
to: "email@domain.com",
subject: "Weekly Reports",
body: "Hi Team,nnPlease find attached summary reports, Thanks!nnThank you,nMyNameHere",
name: "MyNameHere",
attachments: [blob]
}
MailApp.sendEmail(message);
Что он делает?
- Экспортируйте определенный лист, используя URL-адрес экспорта в
xlsx
качестве его формата. - Извлеките URL-адрес экспорта и получите его большой двоичный объект с помощью getBlob(), используйте setName(имя) для переименования файла. Укажите расширение файла в имени.
- Прикрепите большой двоичный объект в своем электронном письме.
Выход:
Комментарии:
1. Пожалуйста, дайте мне знать, если вы столкнулись с проблемой, чтобы я мог соответствующим образом обновить ответ.
2. Спасибо @ron-m за код, следующая ошибка, с которой я сталкиваюсь при запуске кода.
11:16:47 PM Error Exception: Service invoked too many times for one day: premium urlfetch. sendExcel @ code.gs:6
3. Как часто вы вызываете свою функцию? У вас есть другая функция, которая использует метод urlfetch? Вот ограничения квот для сервисов Google
4. Да, вы можете проверить ограничение ежедневной квоты для учетной записи gmail по ссылке, которую я предоставил. Но если вы считаете, что вы не превышаете лимит в 20 000 в день для своей учетной записи gmail, то ваш интервал вызовов может быть тем, который вызвал ошибку. Поскольку в день 86400 секунд, то (20 000/86400 = 0,23) безопаснее вызывать urlfetch с интервалом 0,23 секунды. Вы можете использовать Utilities.sleep () , чтобы ввести задержку
5. Кстати, я обновил ответ. Вам нужно добавить расширение файла
.xlsx
, когда вы задаете имя большого двоичного объекта.