【发布时间】:2019-10-03 06:58:18
【问题描述】:
我使用谷歌表格创建了一个订单表格,其中包含一个脚本,用于通过电子邮件将订单的 pdf 文件发送给供应商。我对其进行了测试,它工作得非常好,所以我将它保存到模板库中。
现在,当我从模板创建一个新的 google Sheet 并运行脚本时,我收到一个错误 - TypeError: Cannot call method "getSheetId" of undefined。
现在,如果我在刚刚创建的新电子表格上复制脚本并调用复制的代码,它就可以工作。奇怪的是,当我现在尝试调用原始代码时,它现在也可以工作了。更奇怪的是,当我现在删除我刚刚制作的重复脚本时,原始代码再次停止工作。
我已经多次这样做了,我得到了相同的结果。
有人有什么想法吗?我在这里做错了什么吗?
function emailOrder(){ // this is the function to call
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var shName = sh.getName()
var email = sh.getRange('I8').getValue();
var dates = sh.getRange('V8').getValue();
var reference = sh.getRange('V5').getValue();
var vendor = sh.getRange('B5').getValue();
var contact = sh.getRange('B8').getValue();
sendSpreadsheetToPdf(shName, email , vendor + ' - '+ dates + ' - ' + reference , "Hi " + contact + ", <br /> <br /> See attached order for reference: " + reference + ", <br /> <br /> Kind regards, <br />NAME<br /> PH NUMBER <br /> <br />");
};
function sendSpreadsheetToPdf(pdfName, email, subject, htmlbody) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = spreadsheet.getId();
var url_base = spreadsheet.getUrl().replace(/edit$/,'');
var sheetId = spreadsheet.getActiveSheet().getSheetId();
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+ (('&gid=' + sheetId ))
// following parameters are optional...
+ '&size=A4' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&top_margin=0.4&bottom_margin=0.4&left_margin=0.4&right_margin=0.4'; // Margins: set all to 0.4
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,
"html content only",
mailOptions);
}
}
【问题讨论】:
-
您能解释一下“当我从模板创建新订单并运行脚本时”吗?你的意思是你创建了一个新的电子表格,但是你调用了附加到旧电子表格的脚本?
-
是的,我的意思是当我从模板创建一个新的电子表格时。感谢您抽出宝贵的时间。我将尝试制作独立脚本而不是绑定脚本。我对 Google Apps 脚本还很陌生,所以只能摸索。
-
我宁愿建议您从电子表格的 UI 创建一个绑定脚本。然后,当您复制电子表格时,我会在您的驱动器上制作副本 - 脚本也应自动复制。
-
这就是我目前正在做的事情。这是一个绑定脚本,所以当我复制工作表时,脚本也会被复制。