【问题标题】:How to Print sheet/range using .gs script in Google Sheets?如何在 Google 表格中使用 .gs 脚本打印表格/范围?
【发布时间】:2019-10-30 14:22:27
【问题描述】:

我正在尝试在 Google 表格中创建一个脚本来选择一个范围并打印它。我正在尝试根据一些参数打印一些信息。我有以下设置所需范围的脚本,但我看不到使用脚本打印它的方法。

function printInvoice() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange("A1:H46");

  range.activate();
}

有什么建议吗?谢谢!

【问题讨论】:

    标签: google-sheets google-sheets-api


    【解决方案1】:

    您可以使用以下脚本:

    var PRINT_OPTIONS = {
      'size': 7,               // paper size. 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B
      'fzr': false,            // repeat row headers
      'portrait': true,        // false=landscape
      'fitw': true,            // fit window or actual size
      'gridlines': false,      // show gridlines
      'printtitle': false,
      'sheetnames': false,
      'pagenum': 'UNDEFINED',  // CENTER = show page numbers / UNDEFINED = do not show
      'attachment': false
    }
    
    var PDF_OPTS = objectToQueryString(PRINT_OPTIONS);
    
    function onOpen(e) {
      SpreadsheetApp.getUi().createMenu('Print...').addItem('Print selected range', 'printSelectedRange').addToUi();
    }
    
    function printSelectedRange() {
      SpreadsheetApp.flush();
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range = sheet.getActiveRange();
    
      var gid = sheet.getSheetId();
      var printRange = objectToQueryString({
        'c1': range.getColumn() - 1,
        'r1': range.getRow() - 1,
        'c2': range.getColumn() + range.getWidth() - 1,
        'r2': range.getRow() + range.getHeight() - 1
      });
      var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + PDF_OPTS + printRange + "&gid=" + gid;
    
      var htmlTemplate = HtmlService.createTemplateFromFile('js');
      htmlTemplate.url = url;
      SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), 'Print range');
    }
    
    function objectToQueryString(obj) {
      return Object.keys(obj).map(function(key) {
        return Utilities.formatString('&%s=%s', key, obj[key]);
      }).join('');
    }
    

    您还需要在您的项目 (File>New>HTML File) 中创建一个名为 js 的 html 文件,然后粘贴以下代码:

    <script>
      window.open('<?=url?>', '_blank', 'width=800, height=600');
      google.script.host.close();
    </script>
    

    这将在您的表格菜单中创建一个按钮,该按钮将打开具有所选范围的 PDF。您可以修改一些设置,例如打印方向、大小或是否在脚本顶部显示网格线。如果您仍想自动打印范围而无需手动通过 print 对话框,您可以:

    【讨论】:

    • 感谢您的回答。您将如何打印自定义尺寸的纸张?
    • 自 2020 年 12 月 31 日起,不支持 Google 云打印。此外,“保存到云端硬盘”选项不适用于 Windows、MacOS 和 Linux 设备,但您可以将文档保存到 Google 云端硬盘从打印预览。就相当于云打印而言,Google 建议“与打印合作伙伴一起打印”,例如 Directprint.io、LRS、NT-ware、PaperCut、Pharos、PrinterLogic、Printix、Y Soft。 Doc ref
    【解决方案2】:

    我偶然发现了您的代码,这是因为“不允许的堆栈溢出问题实际上似乎正是我想要的 - 无法获得有关如何从 App Script 打印工作表的任何详细信息。

    我一直在尝试,但它在您的示例中掉线了 “var htmlTemplate = HtmlService.createTemplateFromFile('js');” 服务找不到“js”的地方。恐怕我还是不明白什么是 html 模板 - 你能解释一下吗?

    【讨论】:

    • 嗨默文,感谢您的贡献。我刚刚意识到我的代码缺少您正确描述的 js 部分 - 所以我编辑了这个问题。希望现在对你有用! :) 关于 HTML 模板,它允许您创建 HTML 骨架并通过占位符插入变量和表达式。您可以阅读有关此功能的更多信息here
    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多