我有一个带有多个标签的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);
}
}
答案 0 :(得分:0)
问题的原因是以下两行。
var sheetId = sheetNumber ? spreadsheet.getSheets()[sheetNumber].getSheetId() : null;
+ (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))
通过两行以上,会发生以下问题。
sheetNumber
为0
时,sheetId
成为null
。sheetId
为0
和null
时,将使用'&id=' + spreadsheetId
。gid=0
时,活动工作表为索引0
(第一页)或索引1
(第二页)时,则使用'&id=' + spreadsheetId
。在三元运算符和if
中,0
和null
被判断为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))
如果这不是您想要的,对不起。