Экспорт нескольких листов в несколько PDF и добавление в Sendmail в виде вложения с текстом HTML - PullRequest
0 голосов
/ 19 июня 2019

Я посмотрел и перепробовал много решений, но по какой-то причине не могу заставить его работать.

Моя цель:

  • Автоматическая отправка электронных писем по времени срабатывания (работает)
  • На основе значения ячейки (работает)
  • С почтовым форматом HTML (форма Google) (работает)
  • С 2 или более вложениями (не работает)

Как я могу изменить код, чтобы он включал 2 файла PDF? Это может быть один из двух вариантов: 1. Возьмите pdf grom папку на диске Google по имени, где я получил рабочую функцию для экспорта 2 или более листов в pdf - используя то же имя (и удаляя старую версию). 2. Преобразуйте 2 или более листов в соответствующие файлы PDF и добавьте их в виде вложений.

Я довольно новичок, поэтому все еще пытаюсь разобраться.

Пробное объединение. Несколько решений, найденных здесь, но я либо продолжаю получать ошибку итерации файла.

При использовании варианта GetFilesByName, если (file.HasNext (), getAs ('application / PDF'), я не получаю сообщение об ошибке, но письмо также не отправляется.

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2; // First row of data to process
  var numRows = sheet.getRange(1,5).getValue(); // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, 15, 3); // this function is: Row, Column, Number of Rows, Number of Columns
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
 // var bijlage1 = DriveApp.getFilesByName('EDC-A.pdf'); // definiëring van file 2
 // var bijlage2 = DriveApp.getFilesByName('EDC-B.pdf'); // definiëring van file 1
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var body = '';
    var html =  HtmlService.createTemplateFromFile('body').evaluate().getContent(); // legt link met Body html file
    var options = {
      htmlBody: html 
    };
    var aantaluzk = row[2]; // Third column
    if (aantaluzk != 0) { // Variable
      var subject = 'Uitzendkrachten te evalueren';
      MailApp.sendEmail(emailAddress,subject,body,options);                
      SpreadsheetApp.flush(); // geen idee wat dit doet?
    }
  }
}

РЕДАКТИРОВАТЬ: как по запросу, Код, содержащий скрипт для экспорта (был в другом файле скрипта) μ Основываясь на комментариях, мне удалось заставить это работать через: - Объедините скрипт экспорта pdf с функцией Sendmail и определите их как переменные. Не понимаю полностью, как это работает с BLOB, но это так. - Повторите сценарий экспорта для каждого листа, изменив необходимые параметры.

В результате получается скрипт, который работает, но, скорее всего, его можно было бы сделать намного проще?

Окончательный результат

// Test en goedgekeurd 19/6
function MailExport() {
  var sheetName = "EDCA";
  var folderID = "1gNoRIktbqYjIzE8txUezW5wt_jliIWYJ"; // Folder id to save in a folder.
  var pdfName = "EDC-A"; // "+Date()" toevoegen zonder "" indien timestamp aan file toegevoegd;

  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  var folder = DriveApp.getFolderById(folderID);

  // Vernietig de vorige versie
  DriveApp.getFilesByName('EDC-A').next().setTrashed(true);  

  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }

  var destSheet = destSpreadsheet.getSheets()[0];
  //repace cell values with text (to avoid broken references) 
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  //save to pdf
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile = folder.createFile(theBlob);

  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);

  // Afdeling 2

  var sheetName = "EDCB";
  var folderID = "1gNoRIktbqYjIzE8txUezW5wt_jliIWYJ"; // Folder id to save in a folder.
  var pdfName = "EDC-B"; // "+Date()" toevoegen zonder "" indien timestamp aan file toegevoegd;

  var sourceSpreadsheet = SpreadsheetApp.getActive();
  var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
  var folder = DriveApp.getFolderById(folderID);

  // Vernietig de vorige versie
  DriveApp.getFilesByName('EDC-B').next().setTrashed(true);  

  //Copy whole spreadsheet
  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  //delete redundant sheets
  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }

  var destSheet = destSpreadsheet.getSheets()[0];
  //repace cell values with text (to avoid broken references) 
  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  //save to pdf
  var theBlob2 = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile2 = folder.createFile(theBlob2);

  //Delete the temporary sheet
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);

  // Onderdeel voor mail

  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2; // First row of data to process
  var numRows = sheet.getRange(1,5).getValue(); // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, 15, 3); // this function is: Row, Column, Number of Rows, Number of Columns
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var body = '';
    var html =  HtmlService.createTemplateFromFile('body').evaluate().getContent(); // legt link met Body html file
    var options = {
      attachments: [theBlob,theBlob2],
      htmlBody: html
    };
    var aantaluzk = row[2]; // Third column
    if (aantaluzk != 0) { // Variable
      var subject = 'Uitzendkrachten te evalueren';
      MailApp.sendEmail(emailAddress,subject,body,options);                
      SpreadsheetApp.flush(); // geen idee wat dit doet?
    }
  }
}

1 Ответ

1 голос
/ 19 июня 2019

Чтобы включить вложения в ваше электронное письмо, вы должны вставить их в «Опции» с синтаксисом здесь :

attachments: [file.getAs(MimeType.PDF), blob]

Таким образом, вы можете включить PDF-файл непосредственно во вложении или конвертировать с помощью

file.getAs(MimeType.PDF)

файл другого формата в формате pdf. Я предлагаю вам внедрить нужные файлы в ваш код с их идентификатором (поскольку имя может быть неоднозначным) с помощью функции:

DriveApp.getFileById()

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

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2; // First row of data to process
  var numRows = sheet.getRange(1,5).getValue(); // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, 15, 3); // this function is: Row, Column, Number of Rows, Number of Columns
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  var bijlage1 = DriveApp.getFileById(IDofPDFfile); // definiëring van file 2
  var bijlage2 = DriveApp.getFileById(IDofNonPDFFile'); // definiëring van file 1
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var message = row[1]; // Second column
    var body = '';
        var options = {
       name: 'this is optional',
   //in this example bijlage1 is a pdf already, while bijlage2 has to be converted to a pdf first:
       attachments: [bijlage1, bijlage2.getAs(MimeType.PDF)]
        }

    var aantaluzk = row[2]; 
// Third column
    if (aantaluzk != 0) { // Variable
      var subject = 'Uitzendkrachten te evalueren';
      MailApp.sendEmail(emailAddress,subject,body,options);                
      SpreadsheetApp.flush(); // geen idee wat dit doet?
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...