Имя вложения электронной почты в скрипте Google Apps

У меня есть следующий сценарий G.A.S для отправки таблицы Google по электронной почте в виде вложения в формате PDF.

  var spreadsheet = SpreadsheetApp.getActive();
  var subject = spreadsheet.getRange("U1:U1").getValues();
  var emailTo = spreadsheet.getRange("V1:V1").getValues();
  var message = spreadsheet.getRange("W1:W1").getValues();
  var pdf = DriveApp.getFileById(spreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:subject,content:pdf, mimeType:'application/pdf'};
  MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]});

Приведенный выше код работает хорошо, за исключением того, что файл, прикрепленный к сообщению электронной почты, имеет странное имя, например «[Ljava.lang.Object_@4e63998c» без расширения «.pdf»! Я ищу способ установить имя для файла pdf перед прикреплением к электронному письму. Имя файла должно совпадать с переменной «субъект».

Заранее спасибо. Омид

Попробовать как getBlob вместо getBytes?

tehhowch 19.06.2018 02:48

@tehhowch TypeError: не удается найти функцию getBlob в объекте Blob.

Omid 20.06.2018 06:58

@omid используйте его без вызова getBytes()

tehhowch 20.06.2018 07:13

Уважаемый @Tanaike, Это было большим подспорьем и сработало. Для получения более подробной информации проверьте комментарии к вашему ответу. Однако я до сих пор не понимаю, что этот маленький [0][0] делает в коде. Не могли бы вы сообщить мне о странице или ссылке, чтобы узнать об использовании этого [0][0]? Большое спасибо, приятель. Заботиться :)

Omid 20.06.2018 07:52

@Tanaike Кстати, есть ли способ отправить этот PDF-файл конкретному человеку через Telegram вместо электронной почты !?

Omid 20.06.2018 08:01

@tehhowch Когда я бросаю getBytes(), я получаю сообщение об ошибке «Вложение не распознается как строковое или двоичное».

Omid 20.06.2018 08:09

Я подумал, что @tehhowch может предложить изменить var pdf = ... и var attach = ... в вашем скрипте на var attach = DriveApp.getFileById(spreadsheet.getId()).getBlob().setName(‌​subject[0][0]);. Теххуч. Если я неправильно понял ваш комментарий, мне очень жаль.

Tanaike 20.06.2018 08:38
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python - это удобный способ автоматизировать процесс отправки электронных писем. Это может быть полезно для...
2
7
1 248
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Значения, полученные getValues(), представляют собой двумерный массив. Я думаю, что имя файла становится такой строкой, потому что в качестве имени файла используется массив. Получите элемент из массива и повторите попытку. Не могли бы вы изменить следующее?

Из :

var attach = {fileName:subject,content:pdf, mimeType:'application/pdf'};

К :

var attach = {fileName:subject[0][0],content:pdf, mimeType:'application/pdf'};

Вы также можете использовать следующую модификацию. В этом случае getValue() может получить значение в виде строки из ячейки «U1».

Из :

var subject = spreadsheet.getRange("U1:U1").getValues();

К :

var subject = spreadsheet.getRange("U1:U1").getValue();

Справка :

Если это не то, что вам нужно, скажите, пожалуйста. Я хотел бы подумать о других решениях.

Ух ты! Большой! Это решило проблему, когда я вставил [0][0]. Однако изменение getValues() на getValue() привело к тому, что имя файла состояло только из одного символа, который был первым символом значения указанной переменной. Кстати, большое спасибо. Браво :)

Omid 20.06.2018 07:48

Я также ценю ваш ясный и подробный ответ, который был полностью полезен для такого новичка, как я, и я мог легко применить его. Спасибо большое, приятель :)

Omid 20.06.2018 07:53

Кстати, есть ли способ отправить этот PDF-файл конкретному человеку через Telegram вместо электронной почты !?

Omid 20.06.2018 08:00

И еще один вопрос. Прилагаемый файл pdf включает около 13 страниц, но только первая пара страниц содержит информацию, а остальные страницы пусты. Есть ли способ ограничить PDF-файл только той частью листа, которая содержит данные, и обрезать пустые страницы ?!

Omid 20.06.2018 08:04

@Omid Спасибо за ответ. [0][0] из subject[0][0] означает адрес элемента в двумерном массиве, извлеченный getValues(). В вашем случае значение из «U1: U1» только одно. Итак, адрес - [0][0]. Вы можете увидеть подробную информацию на stackoverflow.com/questions/966225/…

Tanaike 20.06.2018 08:15

Спасибо за ответ и полезное объяснение. Но вы забыли включить ссылку на подробную информацию. :)

Omid 20.06.2018 08:18

@ Омид, прости. Я добавил URL. Пожалуйста, подтвердите.

Tanaike 20.06.2018 08:18

@Omid Мне жаль, что я плохо знаю английский. Что касается ваших дополнительных вопросов, не могли бы вы опубликовать их, включая подробную информацию, в качестве нового вопроса? Потому что я не мог понять вашу ситуацию из ваших комментариев. Если вы разместили это как новый вопрос, я думаю, что это поможет многим пользователям, включая меня, подумать о вашем решении.

Tanaike 20.06.2018 08:20

Спасибо, я получил ссылку :)

Omid 20.06.2018 08:20

На самом деле ваш английский очень хорош. ОК, я отправлю это как новый вопрос. Ваше здоровье.

Omid 20.06.2018 08:22

@Omid Спасибо за быстрый ответ. Также я хотел бы подтвердить ваш пост.

Tanaike 20.06.2018 08:23

Уважаемый @Tanaike, я разместил свой вопрос в виде нового сообщения здесь stackoverflow.com/q/50941647/9863856

Omid 20.06.2018 08:32

@Omid Спасибо, что сообщили мне об этом.

Tanaike 20.06.2018 08:33

Я немного опоздал, но другой способ решить эту проблему:

var spreadsheet = SpreadsheetApp.getActive();
var subject = spreadsheet.getRange("U1:U1").getValues();
var emailTo = spreadsheet.getRange("V1:V1").getValues();
var message = spreadsheet.getRange("W1:W1").getValues();

var pdf = DriveApp.getFileById(spreadsheet.getId())
                  .getAs('application/pdf')
                  .getBlob()
                  .setName(subject);

MailApp.sendEmail(emailTo, subject, message, {attachments:[pdf]});

Класс Blob имеет метод setNamehttps://developers.google.com/apps-script/reference/base/blob#setName(String), который можно связать с объектом Blob (который является результатом getBlob()).

После этого вам просто нужно добавить объект Blob в массив attachments функции MailApp.sendEmail.

Другие вопросы по теме