Google Script - 将活动工作表作为PDF发送到单元格中列出的电子邮件

时间:2017-08-20 10:17:25

标签: email pdf google-apps-script google-sheets

我正在尝试使用下面的脚本将Google表格文档中的第一张表格发送为PDF格式的电子邮件。要发送到的电子邮件列在单元格A1中。

但是,此脚本将整个电子表格作为PDF发送,而不仅仅是第一张表格。我一直在尝试使用stackoverflow中的一些其他脚本,但这是唯一一个实际发送电子邮件的脚本。

希望你们能帮助我。

        /* Email Google Spreadsheet as PDF */
function emailGoogleSpreadsheetAsPDF() {

  // Send the PDF of the spreadsheet to this email address
  var email = "amit@labnol.org"; 

  // Get the currently active spreadsheet URL (link)
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Subject of email message
  var subject = "PDF generated from spreadsheet " + ss.getName(); 

  // Email Body can  be HTML too 
  var body = "Install the <a href='http://www.labnol.org/email-sheet'>Email Spreadsheet add-on</a> for one-click conversion.";

  var blob = DriveApp.getFileById(ss.getId()).getAs("application/pdf");

  blob.setName(ss.getName() + ".pdf");

  // If allowed to send emails, send the email with the PDF attachment
  if (MailApp.getRemainingDailyQuota() > 0) 
    GmailApp.sendEmail(email, subject, body, {
      htmlBody: body,
      attachments:[blob]     
    });  
}

3 个答案:

答案 0 :(得分:4)

下面是一个工作版本,其中包含一些您可能想要使用的有用参数。

更新代码

function sendSheetToPdfwithA1MailAdress(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[0]; // it will send sheet 0 wich is the first sheet in the spreadsheet.
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  sendSpreadsheetToPdf(0, shName, sh.getRange('A1').getValue(),"test email with the adress in cell A1 ", "This is it !");
}
function sendSpreadsheetToPdf(sheetNumber, pdfName, email,subject, htmlbody) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()  
  var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;  
  var url_base = spreadsheet.getUrl().replace(/edit$/,'');

  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 
      // following parameters are optional...
      + '&size=A4'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=true&printtitle=false&pagenumbers=true'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }
MailApp.sendEmail(
      email, 
      subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);

MailApp.sendEmail(
      Session.getActiveUser().getEmail(), 
      "FRWD "+subject+" (" + pdfName +")", 
      "html content only", 
      mailOptions);
  }
}

答案 1 :(得分:2)

优秀答案已经被接受。我有一个有关仅发送到一定范围的电子邮件的问题,并借此机会对Serge上面的出色回答进行了一些改进。

Mail range not whole sheet - apps script

/*
shNum = 0 for whole workbook or '0', or 0,1,2,etc for specific tab/sheet
shRng = A1 address for desired range, eg 'E1:L25', ignored if not a single sheet shNum
pdfName = text on top of pdf
*/
function mailPdf(shNum,shRng,pdfName,email,subject,htmlbody) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var shId = shNum ? ss.getSheets()[shNum].getSheetId() : null;  
  var url_base = ss.getUrl().replace(/edit$/,'');
  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf
      + (shId ? ('&gid=' + shId) : ('&id=' + ssId))
      + (shRng ? ('&range=E1:L25') : null)
      + '&format=pdf'                   //export format
      + '&size=letter'                      //A3/A4/A5/B4/B5/letter/tabloid/legal/statement/executive/folio
      //+ '&portrait=false'               //true= Potrait / false= Landscape
      //+ '&scale=1'                      //1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to Page
      //+ '&top_margin=0.00'              //All four margins must be set!
      //+ '&bottom_margin=0.00'           //All four margins must be set!
      //+ '&left_margin=0.00'             //All four margins must be set!
      //+ '&right_margin=0.00'            //All four margins must be set!
      + '&gridlines=false'              //true/false
      //+ '&printnotes=false'             //true/false
      //+ '&pageorder=2'                  //1= Down, then over / 2= Over, then down
      //+ '&horizontal_alignment=CENTER'  //LEFT/CENTER/RIGHT
      + '&vertical_alignment=TOP'       //TOP/MIDDLE/BOTTOM
      //+ '&printtitle=false'             //true/false
      //+ '&sheetnames=false'             //true/false
      //+ '&fzr=false'                    //true/false frozen rows
      //+ '&fzc=false'                    //true/false frozen cols
      //+ '&attachment=false'             //true/false

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
      'muteHttpExceptions': true
    }
  }

  var response = UrlFetchApp.fetch(url_base + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');
  if (email) {
    var mailOptions = {
      attachments:blob, htmlBody:htmlbody
    }


MailApp.sendEmail(
      // email + "," + Session.getActiveUser().getEmail() // use this to email self and others
      email,                                              // use this to only email users requested
      subject+' (' + pdfName +')', 
      'html content only', 
      mailOptions);

  }
}

答案 2 :(得分:0)

在这里,我找到了一种非常简单的方法,通过电子邮件以pdf格式发送电子表格

https://spreadsheet.dev/automatically-email-google-sheet-as-pdf-attachment

问题:它正在发送整个文档,而我只想发送特定的工作表。

所以我从中修改了原始代码

//===============

function sendReport() {
  var message = {
    to: "spreadsheetdevdemo@gmail.com",
    subject: "Monthly sales report",
    body: "Hi team,\n\nPlease find the monthly report attached.\n\nThank you,\nBob",
    name: "Bob",
    attachments: [SpreadsheetApp.getActiveSpreadsheet().getAs(MimeType.PDF).setName("Monthly sales report")]
  }
  MailApp.sendEmail(message);
}

//===============

对此

注意:我从Google spreadsheet script export active sheet only to PDF那里获取了一些代码

//===============



// Define your variables here

var recipient="your@email.com";
var subject=SpreadsheetApp.getActiveSpreadsheet().getName();
var body="Hello,\n\nPlease find attached the document.\n\nThank you,\nYOURNAME";
var nameOfSender="YOURNAME";

// End of the stuff you need to edit


// Below, the sheet is converted to pdf in a blob object and that object
// is sent by email with the email-parameters above.



// Other stuff 
var ss = SpreadsheetApp.getActiveSpreadsheet();
//var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
//var sheetName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
//var sheetId = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();

// Base URL
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());

/* Specify PDF export parameters
From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
 */

var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
     + '&size=A4' // paper size legal / letter / A4
     + '&portrait=true' // orientation, false for landscape
     + '&fitw=true&source=labnol' // fit to page width, false for actual size
     + '&sheetnames=false&printtitle=false' // hide optional headers and footers
     + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
     + '&fzr=false' // do not repeat row headers (frozen rows) on each page
     + '&gid='; // the sheet's Id

var token = ScriptApp.getOAuthToken();

var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {                                 
        headers : {
            'Authorization' : 'Bearer ' + token
        }
    }).getBlob().setName(sheet.getName() + ".pdf");

sheet_as_pdf_blob_document=response;


// Here we send the email

function sendReport() {
 
   var message = {
    to: recipient,
    subject: subject,
    body: body,
    name: nameOfSender,
    attachments: [sheet_as_pdf_blob_document]
  }

   MailApp.sendEmail(message);
}


//===============