繁体   English   中英

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

[英]Google Script to email PDF from specific google sheet sends all sheets on some sheets, not others

我有一个带有多个标签的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. var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
  2. + (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))

通过以上两行,出现以下问题。

  • sheetNumber0sheetId变为null
  • sheetId0且为null ,将使用'&id=' + spreadsheetId
  • 当索引1(第二页)上有gid=0的图纸时,当活动图纸是索引0 (第一页)或索引1 (第二页)时,将使用'&id=' + spreadsheetId

在三元运算符if0null被判断为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))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM