Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 将特定范围的单元格导出为PDF-谷歌工作表_Google Apps Script_Google Sheets_Google Sheets Formula_Spreadsheet - Fatal编程技术网

Google apps script 将特定范围的单元格导出为PDF-谷歌工作表

Google apps script 将特定范围的单元格导出为PDF-谷歌工作表,google-apps-script,google-sheets,google-sheets-formula,spreadsheet,Google Apps Script,Google Sheets,Google Sheets Formula,Spreadsheet,我使用谷歌电子表格创建发票。我想要一个脚本,通过它我可以导出PDF格式的选定范围(F1:M44),文件名为发票编号(单元格B2)+“发票”。 我试过stack和youtube上的代码。它们都用于导出图纸,而不是特定范围。解决方案 要能够将特定范围导出为PDF,因为应用程序脚本中没有特定的工具来执行此操作,您需要执行变通方法 以下解决方法将自动将要导出的范围复制到一个新的空白电子表格中,然后只能导出准确的范围 为什么我们需要一个新的电子表格 < p> >导出一个范围而不妨碍.所有空白单元格< /强

我使用谷歌电子表格创建发票。我想要一个脚本,通过它我可以导出PDF格式的选定范围(F1:M44),文件名为发票编号(单元格B2)+“发票”。
我试过stack和youtube上的代码。它们都用于导出图纸,而不是特定范围。

解决方案 要能够将特定范围导出为PDF,因为应用程序脚本中没有特定的工具来执行此操作,您需要执行变通方法

以下解决方法将自动将要导出的范围复制到一个新的空白电子表格中,然后只能导出准确的范围

为什么我们需要一个新的电子表格

< p> >导出一个范围而不妨碍.<强>所有空白单元格< /强>,我们需要<强>隐藏所有不相关的行和列< /强>。要实现这一点,最简单的方法是将所需范围粘贴到工作表的第一个单元格
A1

此外,默认情况下,这将导出电子表格的所有工作表,因此我们只能将此新范围的工作表安排在第一个单元格中,以避免其他数据进入其中。要避免删除原始工作表,最好的方法是创建一个新的电子表格,并在流程完成后将其删除

下面是解决此问题的脚本。通过评论自我解释:

函数myFunction(){
//获取要导出的单元格范围
var rangeValues=SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('D10:F13').getValues();
//获取要存储PDF的驱动器文件夹。否则,请使用根文件夹(如果您不介意的话)
var folder=DriveApp.getFolderById('FOLDERID');
//创建一个空白电子表格,以便仅导出该范围
var destspeadsheet=SpreadsheetApp.create('PDF');
//首先检查您要创建的工作表是否存在。否则请创建它并复制粘贴范围
//我们希望在工作表的第一个值中导出为PDF格式。例如,如果我们的范围是我们想要的5行6列
//例如,它需要从A1复制到F5。然后我们可以隐藏其余的列和行并导出
//我们还剩下什么
var sheet2=destSpreadsheet.getSheetByName('sheet2');
如果(!第2页){
destSpreadsheet.insertSheet('sheet2').getRange('A1:C4').setValues(rangeValues);
var sheet2=destSpreadsheet.getSheetByName('sheet2');
}
//隐藏所有没有内容的行和列
sheet2.hideRows(sheet2.getLastRow()+1,sheet2.getMaxRows()-sheet2.getLastRow());
sheet2.hideColumns(sheet2.getLastColumn()+1,sheet2.getMaxColumns()-sheet2.getLastColumn());
//删除创建新电子表格时自动创建的第一张图纸
destSpreadsheet.deleteSheet(destSpreadsheet.getSheetByName('Sheet1'));
//将我们的新电子表格导出为PDF
var theBlob=destSpreadsheet.getBlob().getAs('application/pdf').setName('pdf');
var newFile=folder.createFile(theBlob);
//删除为导出此范围而创建的电子表格。
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);

}
您必须添加引用该范围的参数。此示例将下载范围b2:e46:

下面是虚拟ID:

{spreadsheet_id}
是一个表示电子表格
的长字符串,例如3qT8h59XF67dac7dBL694VLSRPTCQ0_isnP--BBBpnrQ

{gid_id}
是工作表的id
,例如2563688945


还可以根据需要更改
范围
,例如B2:E46或B:e或2:46
我发现此Windows解决方案非常方便: 它不需要创建新的电子表格。相反,您可以先选择工作表上的单元格,然后单击“打印”按钮,然后将所选范围传递给创建PDF的命令。
但是,我将在电子表格中创建一个新的临时工作表,而不是一个完整的新电子表格,将电子表格中各个位置的数据复制到其中,然后打印,然后删除。

这个答案非常具体地针对这个问题。它包括问题中要求导出的范围“F1:M44”。此外,PDF文件的名称来自B2中的单元格

可以从Google工作表导出一个范围,而无需隐藏工作表选项卡、行和列,或创建临时的新电子表格

function exportRngToPdf(range,shTabName) {
  var blob,exportUrl,name,options,pdfFile,response,sheetTabId,ss,ssID,url_base;

  range = range ? range : "F1:M44";//Set the default to whatever you want

  shTabName = "Sheet1";//Replace the name with the sheet tab name for your situation
  ss = SpreadsheetApp.getActiveSpreadsheet();//This assumes that the Apps Script project is bound to a G-Sheet
  ssID = ss.getId();
  sh = ss.getSheetByName(shTabName);
  sheetTabId = sh.getSheetId();
  url_base = ss.getUrl().replace(/edit$/,'');
  name = sh.getRange("B2").getValue();
  name = name + "invoice"

  //Logger.log('url_base: ' + url_base)

  exportUrl = url_base + 'export?exportFormat=pdf&format=pdf' +

    '&gid=' + sheetTabId + '&id=' + ssID +
    '&range=' + range + 
    //'&range=NamedRange +
    '&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

  //Logger.log('exportUrl: ' + exportUrl)

  options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
    }
  }

  options.muteHttpExceptions = true;//Make sure this is always set

  response = UrlFetchApp.fetch(exportUrl, options);

  //Logger.log(response.getResponseCode())

  if (response.getResponseCode() !== 200) {
    console.log("Error exporting Sheet to PDF!  Response Code: " + response.getResponseCode());
    return;

  }
  
  blob = response.getBlob();
  blob.setName(name + '.pdf')

  pdfFile = DriveApp.createFile(blob);//Create the PDF file
  //Logger.log('pdfFile ID: ' +pdfFile.getId())
}
有多种策略可用于将谷歌工作表的一部分导出为PDF

  • 创建一个只包含所需内容的新电子表格文件
  • 创建一个新的“图纸”选项卡,将内容放入“图纸”选项卡并隐藏任何内容 其他图纸选项卡,隐藏不需要的行和列
  • 使用范围设置构建下载URL
    • 使用范围地址
    • 使用命名范围-&gid=sheetId&range=NamedRange
  • 将内容导出到Google文档并从Google文档创建PDF
  • 将G-Sheet内容与模板文件合并,并从中创建PDF 模板文件
  • 从工作表中获取一系列内容,将其转换为HTML并使用 HTML来创建PDF文件

我会使用下载URL中包含的范围来构建下载URL。

如何将该范围复制到临时工作表,导出该范围,然后将其删除。我通过选择范围>打印>打印选定单元格,然后将文件另存为pdf来完成此操作。我想减少这些步骤。单击并准备好保存文件请回答:这很好,可以生成pdf格式的值,但是如何发送格式(常规格式,包括字体、列宽等,以及条件格式?)我没有看到setFormatting,就像有SetValues一样。这很好,但是此链接仅在桌面浏览器上打开pdf。在手机上,你需要在chrome浏览器中复制并粘贴链接,然后确定,否则会打开google docs应用程序