Эффективный способ отправки электронной таблицы по электронной почте с помощью функции GAS? - PullRequest
2 голосов
/ 26 июня 2019

Я создаю аддон для Google Sheets, который волонтерские клубы моей местной средней школы могут использовать, чтобы отслеживать часы волонтеров своих членов. Большая часть кода выполнена и работает очень хорошо, и в настоящее время я работаю над системой, которая отправит участнику электронную таблицу со списком всех событий добровольцев, которые они зарегистрировали. У меня есть GAS, создающая отдельную электронную таблицу, и затем посылаю электронное письмо с той отдельной электронной таблицей, приложенной в PDF. Когда электронное письмо получено, PDF-файл пуст, за исключением единственной пустой ячейки в левом верхнем углу страницы.

Я довольно новичок в GAS, но смог понять содержание довольно легко. Я пробовал только один метод отправки таблицы - с помощью .getAs (MimeType.PDF). Когда я изменил «PDF» на «GOOGLE_SHEETS», GAS вернул ошибку: «Объект Blob должен иметь ненулевые данные для этой операции». Я не совсем уверен, что такое объект Blob, и не нашел ни одного веб-сайта или видео, которые бы полностью его объяснили, поэтому я не уверен, как решить эту ошибку.

Мне кажется, у меня проблема с захватом файла, потому что он либо отправляет пустой PDF, либо возвращает ошибку, утверждая, что ему нужны "ненулевые данные".

function TigerMail()
{
  var Drive = DriveApp;
  var app = SpreadsheetApp;
  var LOOKUP = app.getActiveSpreadsheet().getSheetByName("Student 
  Lookup");
  var Name = LOOKUP.getRange("E1").getValue();
  Name = Name + "'s Hours";
  //app.openById(Name+"'s Hours");
  var HOURS = app.create(Name);
  var ESheet = HOURS.getSheets()[0];
  var ROW = LOOKUP.getLastRow();
  var arr = LOOKUP.getRange("D1:J"+ROW).getValues();
  var cell = ESheet.getRange("A1:G"+ROW);
  cell.setValues(arr);

////////////////////////////////////////////////////

  var LOOKUP = app.getActiveSpreadsheet().getSheetByName("Student 
  Lookup");
  var cell = LOOKUP.getRange("D1");  
  var Addr = cell.getValue();
  var ROW = LOOKUP.getLastRow();
  var file = Drive.getFilesByName(Name);
  var file = file.next();
  var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS);

  TigerMail.sendEmail(Addr, "Hours", "Attached is a list of all of the 
  events you have volunteered at:", {attachments: [FORMAT]} );
}

последние четыре строки, в которых происходят ошибки. Я считаю, что я неправильно понимаю, как .next () и .getFilesByName () работают.

(над строкой комментария: создание таблицы часов)

(ниже строки комментария: захват электронной таблицы и прикрепление ее к электронному письму)

Вот ссылка на Google Sheet: https://docs.google.com/spreadsheets/d/1qlUfTWaj-VyBD2M45F63BtHaqF0UOVkwi04XwZFJ4vg/edit?usp=sharing

1 Ответ

1 голос
/ 26 июня 2019
  • В вашем скрипте создается новая электронная таблица и помещаются значения.
  • Вы хотите отправить электронное письмо, прикрепив файл, который был преобразован из созданной таблицы в формат PDF.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Очки модификации:

  • О Drive.getFilesByName(Name), к сожалению, нет способа getFilesByName() в Drive.
    • Я думаю, что если вы хотите использовать созданную электронную таблицу, можно использовать HOURS из var HOURS = app.create(Name).
  • О var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS), в случае Google Docs, при получении BLOB-объекта, BLOB-объект автоматически конвертируется в формат PDF. Это также может быть использовано для вашей ситуации.
  • Чтобы сохранить значения, помещенные в созданную электронную таблицу, она использует SpreadsheetApp.flush().

Когда указанные пункты отражаются в вашем сценарии, он становится следующим:

Модифицированный скрипт:

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

От:
var file = Drive.getFilesByName(Name);
var file = file.next();
var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS);
Для того, чтобы:
SpreadsheetApp.flush();
var FORMAT = HOURS.getBlob();

Примечание:

  • В вашем скрипте кажется, что var ROW = LOOKUP.getLastRow() не используется.

Ссылки

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...