Javascript 脚本下载谷歌表中的一系列单元格作为PDF文件到本地计算机和其他自动化脚本?
我已经制作了g表格式的发票,如下所示: 在单元格B8:C8(发票收件人下方)中,有一个下拉列表,用于从客户工作表中获取数据 需要什么Javascript 脚本下载谷歌表中的一系列单元格作为PDF文件到本地计算机和其他自动化脚本?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我已经制作了g表格式的发票,如下所示: 在单元格B8:C8(发票收件人下方)中,有一个下拉列表,用于从客户工作表中获取数据 需要什么 制作选定单元格的PDF。我想稍后添加一些按钮,并将宏/脚本分配给它们,然后g sheet print操作将打印工作表上的所有内容。因此,只需打印发票部分(范围-A1:G46)。图纸名称为客户名称+发票日期(F8) 我使用了stack over flow中的一些脚本,但它们增加了边距。我想要的是一个全出血pdf,我可以得到,如果我使用打印(ctrl+p)按钮 将发
function Untitledmacro1() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
spreadsheet.getRange('A1').activate();
spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
spreadsheet.getCurrentCell().offset(1, 0).activate();
spreadsheet.getCurrentCell().setFormulaR1C1('=R[-1]C[0]+1');
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
spreadsheet.getRange('Invoice!E8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
spreadsheet.getRange('Invoice!F8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
spreadsheet.getCurrentCell().offset(0, 1).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
spreadsheet.getRange('Invoice!B8:C8').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
spreadsheet.getCurrentCell().offset(0, 2).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Invoice Register'), true);
spreadsheet.getRange('Invoice!F16').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};
=CONCATENATE(0, DAY(F8),MONTH(F8), COUNTA('Invoice Register'!B2:B99)+1,"/",21920)
但是我也很想为这个制作一个剧本
基本上,我用VBA在excel中制作了一个发票工具,现在最大的问题是,每当我从excel导出PDF时,无论遇到什么问题,右边都会显示白色的边距。
我猜按钮很明显,每当我按下“新发票”时,发票号就会增加1
很抱歉,这篇文章太长了,因为我必须尽可能清楚地说明这一点,而且我对谷歌应用程序脚本完全陌生。非常感谢您的帮助。我创建了一个函数,可以将一个范围导出为无边框pdf格式 请记住,这不会将数据集中到页面上,因此如果数据太小,则无法“删除”空白 以下是脚本:
function downloadRangeToPdf() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A1:E20");
//Create temporary Spreadsheet
var tempSpreadsheet = SpreadsheetApp.create("tempSheetInvoiceExport", range.getValues().length, range.getValues()[0].length);
var tempSheet = tempSpreadsheet.getSheets()[0];
var tempRange = tempSheet.getRange("A1:E20");
tempRange.setValues(range.getDisplayValues());
tempRange.setTextStyles(range.getTextStyles());
tempRange.setBackgrounds(range.getBackgrounds());
tempRange.setFontColors(range.getFontColors());
tempRange.setFontFamilies(range.getFontFamilies());
tempRange.setFontLines(range.getFontLines());
tempRange.setFontStyles(range.getFontStyles());
tempRange.setFontWeights(range.getFontWeights());
tempRange.setHorizontalAlignments(range.getHorizontalAlignments());
tempRange.setNumberFormats(range.getNumberFormats());
tempRange.setTextDirections(range.getTextDirections());
tempRange.setTextRotations(range.getTextRotations());
tempRange.setVerticalAlignments(range.getVerticalAlignments());
tempRange.setWrapStrategies(range.getWrapStrategies());
SpreadsheetApp.flush(); //Force changes to be written before proceeding.
//Generate Download As PDF Link
var url = 'https://docs.google.com/spreadsheets/d/{ID}/export?'.replace('{ID}', tempSpreadsheet.getId());
var exportOptions = 'exportFormat=pdf&format=pdf' + // export as pdf / csv / xls / xlsx
'&size=letter' + // paper size legal / letter / A4
'&portrait=true' + // orientation, false for landscape
'&fitw=true&source=labnol' + // fit to page width, false for actual size
'&sheetnames=false&printtitle=false' + // hide optional headers and footers
'&pagenumbers=false&gridlines=false' + // hide page numbers and gridlines
'&fzr=false' + // do not repeat row headers (frozen rows) on each page
'&top_margin=0.00' + //All four margins must be set!
'&bottom_margin=0.00' + //All four margins must be set!
'&left_margin=0.00' + //All four margins must be set!
'&right_margin=0.00' + //All four margins must be set!
'&gridlines=false' + //true/false
'&gid=' + tempSheet.getSheetId(); // the sheet's Id
var token = ScriptApp.getOAuthToken();
var blob = UrlFetchApp.fetch(url + exportOptions, {
headers: {
Authorization: 'Bearer '+token
}
}).getBlob().setName(tempSpreadsheet.getName()+".pdf");
var pdfFile = DriveApp.createFile(blob);
var downloadLink = HtmlService
.createHtmlOutput('<p>Download your file <a href="' + pdfFile.getUrl() + '" target="_blank">here</a>.</p>')
.setWidth(200)
.setHeight(100);
SpreadsheetApp.getUi().showModalDialog(downloadLink, "Download PDF");
DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true); //Place temporary sheet on trash
}
函数下载RangeTopDF(){
var sheet=SpreadsheetApp.getActiveSheet();
var范围=sheet.getRange(“A1:E20”);
//创建临时电子表格
var tempseadsheet=SpreadsheetApp.create(“tempSheetInvoiceExport”,range.getValues().length,range.getValues()[0].length”);
var tempSheet=tempsheadsheet.getSheets()[0];
var tempRange=tempSheet.getRange(“A1:E20”);
setValues(range.getDisplayValues());
setTextStyles(range.getTextStyles());
setBackgrounds(range.getBackgrounds());
setFontColors(range.getFontColors());
setFontFamilies(range.getFontFamilies());
setFontLines(range.getFontLines());
setFontStyles(range.getFontStyles());
tempRange.setFontWeights(range.getFontWeights());
setHorizontalAlignments(range.getHorizontalAlignments());
setNumberFormats(range.getNumberFormats());
tempRange.setTextDirections(range.getTextDirections());
setextrotations(range.getTextRotations());
setVerticalAlignments(range.getVerticalAlignments());
setWrapStrategies(range.getWrapStrategies());
SpreadsheetApp.flush();//在继续之前强制写入更改。
//生成下载为PDF链接
var url='1〕https://docs.google.com/spreadsheets/d/{ID}/export?'.replace({ID}',tempseadsheet.getId());
var exportOptions='exportFormat=pdf&format=pdf'+//导出为pdf/csv/xls/xlsx
'&size=letter'+//纸张大小合法/letter/A4
“&trait=true”+//方向,横向为false
“&fitw=true&source=labnol”+//适合页面宽度,实际大小为false
'&sheetnames=false&printtitle=false'+//隐藏可选的页眉和页脚
“&pagenumbers=false&gridlines=false”+//隐藏页码和网格线
'&fzr=false'+//不要在每页上重复行标题(冻结行)
“&top_margin=0.00”+//必须设置所有四个边距!
“&bottom_margin=0.00”+//必须设置所有四个边距!
“&left_margin=0.00”+//必须设置所有四个边距!
“&right_margin=0.00”+//必须设置所有四个边距!
“&gridlines=false”+//true/false
“&gid=”+tempSheet.getSheetId();//工作表的Id
var token=ScriptApp.getOAuthToken();
var blob=UrlFetchApp.fetch(url+exportOptions{
标题:{
授权:“持票人”+代币
}
}).getBlob().setName(tempseadsheet.getName()+“.pdf”);
var pdfFile=DriveApp.createFile(blob);
var downloadLink=HtmlService
.createHtmlOutput(“下载您的文件。”)
.setWidth(200)
.设置高度(100);
SpreadsheetApp.getUi().showModalDialog(下载链接,“下载PDF”);
DriveApp.getFileById(tempseadsheet.getId()).setTrashed(true);//将临时工作表放在垃圾箱上
}
我正在使用上面介绍的urlParameters创建导出,然后将其设置为驱动器文件,以便稍后下载
如果您希望以更合理的方式命名您的文件,您可以始终将发票号附加到临时工作表中,这样文件将相应地命名。要添加到“伟大”,可以通过URL选项直接下载PDF格式的文件。您不必创建临时工作表
URL选项似乎是:
&r1 // first row to print: 0-indexed
&r2 // last row to print: 1-indexed
// this seems inconsistent; maybe it is technically the first row that is not printed, 0-indexed
&c1 // first column to print: 0-indexed
&c2 // last column to print: 1-indexed (see above)
这些URL选项包含在上的代码中
以下是如何附加这些参数的两个示例:
&r1=0&r2=1&c1=0&c2=3 // cells A1:C1
&r1=2&r2=3&c1=3&c2=6 // cells D3:F4
如果搜索路径中有隐藏的行/列,则这些行/列的行为似乎很奇怪,似乎会显示额外的单元格。我必须下载到本地计算机,因为我必须在发票发送到客户端之前对其进行数字签名。关于从电子表格导出PDF的选项,我认为这些线程(和)可能很有用。顺便问一下,在你的问题中,有两个问题是下载一系列单元格的
脚本吗
&r1=0&r2=1&c1=0&c2=3 // cells A1:C1
&r1=2&r2=3&c1=3&c2=6 // cells D3:F4