Apps Script 如何实现指定范围按自定义份数批量复制后打印
Apps Script 批量生成指定份数打印区域实现方案
核心实现步骤
- 添加自定义交互入口,支持用户输入需要打印的份数
- 读取你预设的目标打印范围的全部内容、格式、样式,避免复制后排版错乱
- 按照输入的份数循环复制目标区域,依次追加到文档的空白位置,所有副本生成完成后直接打印全文档即可
- 可选添加临时隐藏标识,打印完成后一键删除所有生成的副本,还原原始文档
Google Sheets 示例代码
// 初始化自定义菜单 function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('批量打印工具') .addItem('生成打印副本', 'generatePrintCopies') .addItem('清空生成的副本', 'clearCopies') .addToUi(); } function generatePrintCopies() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); const ui = SpreadsheetApp.getUi(); // 自定义你的目标打印范围,这里示例是A1到C10 const printRange = sheet.getRange('A1:C10'); const rangeHeight = printRange.getNumRows(); const rangeWidth = printRange.getNumColumns(); // 弹出输入框获取打印份数 const inputRes = ui.prompt('请输入需要打印的份数:', ui.ButtonSet.OK_CANCEL); if (inputRes.getSelectedButton() !== ui.Button.OK) return; const copyCount = parseInt(inputRes.getResponseText()); if (isNaN(copyCount) || copyCount < 1) { ui.alert('请输入有效的正整数份数'); return; } // 循环生成副本,每份之间空1行避免粘连 let startRow = printRange.getLastRow() + 2; for (let i = 0; i < copyCount - 1; i++) { const targetRange = sheet.getRange(startRow, 1, rangeHeight, rangeWidth); printRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_ALL, false); startRow += rangeHeight + 1; } ui.alert(`已成功生成${copyCount}份副本,可直接打印整张表格`); } // 清空生成的副本,还原原始文档 function clearCopies() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 自定义你原始内容的最后一行,示例是原始内容到第10行,后面的全部删除 const originalLastRow = 10; const maxRow = sheet.getMaxRows(); if (maxRow > originalLastRow) { sheet.deleteRows(originalLastRow + 1, maxRow - originalLastRow); } SpreadsheetApp.getUi().alert('已清空所有生成的副本'); }
Google Docs 示例代码
// 初始化自定义菜单 function onOpen() { const ui = DocumentApp.getUi(); ui.createMenu('批量打印工具') .addItem('生成打印副本', 'generatePrintCopies') .addToUi(); } function generatePrintCopies() { const doc = DocumentApp.getActiveDocument(); const body = doc.getBody(); const ui = DocumentApp.getUi(); // 自定义你的目标打印范围,示例是取第1到第3个段落(可根据需求调整为表格、指定位置等) const printContent = []; const startIndex = 0; const endIndex = 2; for (let i = startIndex; i <= endIndex; i++) { const element = body.getChild(i).copy(); printContent.push(element); } // 获取打印份数 const inputRes = ui.prompt('请输入需要打印的份数:', ui.ButtonSet.OK_CANCEL); if (inputRes.getSelectedButton() !== ui.Button.OK) return; const copyCount = parseInt(inputRes.getResponseText()); if (isNaN(copyCount) || copyCount < 1) { ui.alert('请输入有效的正整数份数'); return; } // 循环生成副本,每份之间加分页符 for (let i = 0; i < copyCount - 1; i++) { body.appendPageBreak(); printContent.forEach(item => { body.appendParagraph(item.asParagraph().copy()); }); } doc.saveAndClose(); ui.alert(`已成功生成${copyCount}份副本,可直接打印整个文档`); }
注意事项
- 代码中的目标范围、原始内容边界需要根据你的实际文档情况调整
- 如果需要保留原始文档的页眉页脚、条件格式等特殊样式,可在复制方法中调整粘贴类型,确保格式完全对齐
- 若不需要保留生成的副本,打印完成后调用清空方法即可还原文档
内容的提问来源于stack exchange,提问作者Sebastien LEBLANC
相关产品推荐
相关产品推荐

