Отправьте по электронной почте файл Excel, прикрепленный к Указанному листу Google

#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 , когда вы задаете имя большого двоичного объекта.