用于从特定Google工作表通过电子邮件发送PDF的Google脚本会将所有工作表发送给某些工作表,而不是其他工作表

时间:2018-10-24 17:02:07

标签: google-apps-script

我有一个带有多个标签的Google电子表格。我在每个工作表上都有一个按钮,该按钮调用函数来创建和发送活动工作表的pdf。当工作表(标签)位于第一或第二位置时,生成的pdf是所有工作表,而不仅仅是活动工作表。我该如何调整,使其每次仅发送活动工作表?在我看来,问题出在使用索引号和getSheets()函数。这是代码:

function sendSheetToPdf(){ // this is the function to call
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet(); // it will send the active sheet.
  // if you change the number, change it also in the parameters below
  var shName = sh.getName()
  var shNum = (ss.getActiveSheet().getIndex() - 1)
  sendSpreadsheetToPdf(shNum, sh.getRange('I5').getValue(), sh.getRange('F12').getValue(),sh.getRange('I3').getValue(), sh.getRange('B6').getValue());
}
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
      + '&printtitle=false'
      + '&scale=4'
      + '&portrait=false'    // orientation, false for landscape
      + '&sheetnames=false'
      + '&pagenumbers=false'  //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 +")", 
      htmlbody, 
      mailOptions);

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

1 个答案:

答案 0 :(得分:0)

问题原因:

问题的原因是以下两行。

  1. var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
  2. + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))

通过两行以上,会发生以下问题。

  • sheetNumber0时,sheetId成为null
  • sheetId0null时,将使用'&id=' + spreadsheetId
  • 当索引为1(第二页)的工作表为gid=0时,活动工作表为索引0(第一页)或索引1(第二页)时,则使用'&id=' + spreadsheetId

在三元运算符和if中,0null被判断为false。通过上述问题,当活动工作表为第一页和第二页时,将返回包含所有工作表的PDF文件。

修改点:

我认为ss.getActiveSheet().getIndex()总是有索引号。

这些修改如何?

发件人:

var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;

+ (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId)) 

收件人:

var sheetId = spreadsheet.getSheets()[sheetNumber].getSheetId();

+ sheetId

注意:

如果要检查变量,如何进行如下修改?

收件人:

var sheetId = !isNaN(sheetNumber) && sheetNumber >= 0 && sheetNumber < spreadsheet.getSheets().length ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;

+ (sheetId != null ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))

如果这不是您想要的,对不起。