Как получить PDF-файлы Google Drive с надписью «имя содержит информацию в ячейке D1: D из таблицы» и отправить их в виде электронных писем каждому контакту в столбце A - PullRequest
0 голосов
/ 08 ноября 2019

Отказ от ответственности: я новичок в программировании, поэтому, пожалуйста, потерпите меня:)

Я пытаюсь отправлять электронные письма с вложенными файлами PDF на разные контакты электронной почты в электронной таблице Google. Каждое вложение должно быть уникальным для каждого имени путем поиска этого имени файла на диске Google. Может ли кто-нибудь помочь с этим дополнительным фрагментом кода?

У меня есть код, который в настоящее время отправляет электронные письма с пользовательским сообщением и вложенным файлом, и помечает каждое электронное письмо как отправленное в столбце C после завершения работы скрипта. Тем не менее, я хотел бы отправить различные вложения PDF на каждый адрес электронной почты, в идеале, написав код, который получает «Имя инвестора» в столбце D, ищет файл на Google Диске, который содержит это имя, и прикрепляет этот файлна электронное письмо для отправки.

Итак, мне нужно получить файл PDF по каждому имени в каждой соответствующей ячейке, а не так, как написано ниже (я считаю):

var file =DriveApp.getFilesByName ('SHARE CERTIFICATE # 60 - JOHN APPLE.pdf');

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 250;   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows, 250)
  // 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 emailSent = row[2];     // Third column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Sending emails from a Spreadsheet";
      var file = DriveApp.getFilesByName('SHARE CERTIFICATE #60 - JOHN APPLE.pdf');
  if (file.hasNext()) {
    MailApp.sendEmail(emailAddress, subject, message, {
    attachments: [file.next().getAs(MimeType.PDF)],
    name: 'Custom email Team'
 });
      sheet.getRange(startRow + i, 3).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}
}

Окончательный результат, который я ожидаю:файл с именем файла, которое соответствует имени каждого получателя электронной почты

Заранее большое спасибо, это очень поможет! :)

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

В вашем коде отсутствует мелкая деталь. По сути, вы должны получать данные из столбца D при использовании getRange:

var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
var startCol = 1;
var numCols = 4; // Number of columns to process (should include column D)
// Fetch the range of cells A2:D
var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);

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

Затем внутри цикла извлеките значение в столбце D, например:

var fileName = row[3];      // Fourth column

Наконец, вы извлекаете файл с диска следующим образом:

var files = DriveApp.getFilesByName(fileName);

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

// This constant is written in column C for rows for which an email
// has been sent successfully.
var EMAIL_SENT = "EMAIL_SENT";

function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow() - startRow + 1; // Number of rows to process
  var startCol = 1;
  var numCols = 4; // Number of columns to process (should include column D)
  // Fetch the range of cells A2:D
  var dataRange = sheet.getRange(startRow, startCol, numRows, numCols);
  // 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 emailSent = row[2];     // Third column
    var fileName = row[3];      // Fourth column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "Sending emails from a Spreadsheet";
      var files = DriveApp.getFilesByName(fileName);
      if (files.hasNext()) {
        var file = files.next();
        MailApp.sendEmail(emailAddress, subject, message, {
          attachments: [file], // No need to use getAs if your file is already a PDF
          name: 'Custom email Team'
        });
        sheet.getRange(startRow + i, 3).setValue(EMAIL_SENT);
        // Make sure the cell is updated right away in case the script is interrupted
        SpreadsheetApp.flush();
      }
    }
  }
}

Я внес несколько небольших изменений в этот код (например, изменив переменную file на files изатем определение var file = files.next()).

Надеюсь, это вам поможет.

0 голосов
/ 08 ноября 2019

Как-то так будет работать, я думаю:

function sendEmails() {
  var ss=SpreadsheetApp.getActive();
  var sheet=ss.getActiveSheet();
  var logsheet=ss.getSheetByName('logSheet');//added logsheet
  if(!logsheet){ss.insertSheet('logSheet');}
  var startRow=3;//added one row here to accomodate subject and pdfFldrId  
  var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-startRow-1,sheet.getLastColumn())
  var data = dataRange.getValues();
  var subject= sheet.getRange("B2").getValue();
  var pdfFldrId=sheet.getRange("C2").getValue();
  for (var i=0;i<data.length;++i) {
    var row=data[i];
    var emailAddress=row[0];  
    var message=row[1];       
    var emailSent=row[2];     
    var pdfName=row[3];        
    var files=DriveApp.getFolderById(pdfFldrId).getFilesByName(pdfName);
    var n=0;
    while(files.hasNext()) {
      var file=files.next();
      n++;
    }
    if(n>1){
      var ts=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss");
      logsheet.append([ts,pdfName,'more than file with this name']);
      continue;//breaks out of loop increment index and keep going
    }
    if(emailSent!="EMAIL_SENT") {

    MailApp.sendEmail(emailAddress, subject, message, {attachments:[file]});
      sheet.getRange(startRow + i, 3).setValue("EMAIL_SENT");
    }
  }
}

Если вы хотите отправить другое изображение с тем же списком адресов электронной почты, просто продублируйте лист и измените pdfFldrId и тему, которые находятся в C2 иВ2 и научитесь хранить разные изображения в разных папках с одинаковыми именами файлов.

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