Google工作表脚本(电子邮件至PDF)突然发送损坏的PDF
我有一个GoogleSheet脚本,它可以将页面以PDF格式发送到电子邮件中,直到昨天为止一直工作正常。突然,它开始发送无法打开的损坏PDF 该脚本运行良好,如果只是不能打开PDF文件,因为它说不能显示-无效的格式 你知道为什么它会停止工作吗Google工作表脚本(电子邮件至PDF)突然发送损坏的PDF,pdf,google-apps-script,google-sheets,Pdf,Google Apps Script,Google Sheets,我有一个GoogleSheet脚本,它可以将页面以PDF格式发送到电子邮件中,直到昨天为止一直工作正常。突然,它开始发送无法打开的损坏PDF 该脚本运行良好,如果只是不能打开PDF文件,因为它说不能显示-无效的格式 你知道为什么它会停止工作吗 function sendSheetToPdfwithA1MailAdress(){ // this is the function to call var ss = SpreadsheetApp.getActiveSpreadsheet(); v
function sendSheetToPdfwithA1MailAdress(){ // this is the function to call
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheets()[0]; // it will send sheet 0 which is the first sheet in the spreadsheet.
// if you change the number, change it also in the parameters below
var shName = sh.getName()
// This function uses a cell in the spreadsheet that names the file that is being saved as getfilename(). using this function will pull from a certain Cell (G4 in this case)
function getFilename() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName('N1944E'); // Edit the sheet name as necessary
var cell = sheet.getRange('C8'); //Cell to pull file name from.
var filename = cell.getValue();
return filename;
}
sendSpreadsheetToPdf(0, shName, sh.getRange('C6').getValue(),"Air Attack Daily Fire Sheet " + getFilename() );
}
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(),
" "+subject+" (" + pdfName +")",
"html content only",
mailOptions);
}
}
您是否可以尝试以下操作,而不是当前的blob声明:
var blob = response.getBlob().getAs('application/pdf').setName(pdfName + ' .pdf');
参考资料:
我也有同样的问题,但我刚刚解决了。问题在于:
var url_base = ss.getUrl().replace(/edit$/,'') + "export?";
getUrl返回的url版本似乎与以前不同。它现在在url上追加以下内容:ouid=&urlBuilderDomain=YOURDOMAIN使用记录器自己检查它
这导致pdf导出出现问题。因此,我构建了自己的url地址,将该行替换为以下内容:
var url_base = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/" + "export?";
它现在似乎正在工作!以下是生成我的blob的完整代码:
function generatePDF(pdfName, sheet, portrait){
var token = ScriptApp.getOAuthToken();
var params = {
headers: {
'Authorization': 'Bearer ' + token,
},
'muteHttpExceptions' : true
};
var sheetId = sheet.getSheetId();
var ss = sheet.getParent();
// var url_base = ss.getUrl().replace(/edit$/,'') + "export?";
var url_base = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/" + "export?";
var url_ext = 'exportFormat=pdf' //export as pdf
+ '&format=pdf' //export as pdf
+ '&gid=' + sheetId
+ '&size=letter' // paper size
+ '&portrait=' + portrait // orientation, false for landscape
+ '&fitw=true' // fit to width, false for actual size
+ '&sheetnames=false' //optional headers and footers
+ '&printtitle=false' //optional headers and footers
+ '&pagenumbers=true' //page numbers
+ '&gridlines=true' // gridlines
+ '&fzr=true' // repeat row headers (frozen rows) on each page
var response = UrlFetchApp.fetch(url_base + url_ext, params);
var blob = response.getBlob().setName(pdfName + ".pdf");
return blob;
}
试试这个:
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 = "docs.google.com/spreadsheets/d" + spreadsheetId + "/export?";
var url_ext = '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(),
},
'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,
subject+" (" + pdfName +")",
"html content only",
mailOptions);
MailApp.sendEmail(
Session.getActiveUser().getEmail(),
" "+subject+" (" + pdfName +")",
"html content only",
mailOptions);
}
}
我替换了这个:var blob=response.getBlob.setNamepdfName+'.pdf';有了这个:``var blob=response.getAs'application/pdf'.setNamepdfName+'.pdf,``然后我得到了这个错误:无效或意外的标记行49,文件Code.gsdismissunforty我的邮箱中仍然有一个损坏的pdf。代码运行正常,但PDF已损坏。同样的问题。它没有改变任何东西。你能提供一个PDF文档来提供这个错误消息吗?也许腐败的本质会给我们一个线索。@Davidvandriesche这里有一个PDF的链接,我无法打开。您可能需要从Google Drive下载它。你怀疑我和你有同样的问题吗?你怀疑我代码中的哪一行被关闭了?我怀疑。将此:[var url_base=spreadsheet.getUrl.replace/edit$/,;]更改为:[var url_base=+spreadsheet.getId+/;]现在我得到:异常:返回代码404的请求失败。截断服务器响应:修复了它!你的代码缺少a/导致了我的麻烦。var url_base=docs.google.com/spreadsheets/d/+spreadsheet.getId+/;很好的发现!!谢谢!我觉得我们很接近。我用你的那一半代码替换了我的那一半代码,然后它就执行了,但我现在根本没有收到电子邮件。我使用C6输入我要发送到的电子邮件地址。所以你的代码和我的不一样。我可能不得不从头开始。是的,我们正在以不同的方式处理实际的电子邮件过程,但将工作表作为pdf文件检索的概念已经存在。您只需要修改代码以满足您的需要。在执行url获取后,尝试记录响应变量,并查看其内容。如果有一个错误,它应该出现在那里,让你知道发生了什么。