如何通过脚本将Google Sheets表格完全一致复制到Google Docs
问题描述
- 需要将Google Sheets中的表格完全保留原格式复制到Google Docs中
- 现有脚本复制出的表格与原表格式不一致,例如原表F1:G1的合并单元格在Docs中被拆分,格式匹配度低
原有实现代码
function table() { var ss = Sheets.Spreadsheets.Values.get("assassa", String("Sheet1!A1:Z")).values; var doc = DocumentApp.openById("asas"); // 可通过名称/ID定位目标文档 var body = doc.getBody(); var date = new Date(); var time = date.toLocaleString("id", { "day": "2-digit", "month": "long", "year": "numeric", "minute": "2-digit", "timeZoneName": "short", "minute": "2-digit", "second": "2-digit", "hour": "2-digit", }) var dataYouWant = ss;// 存储单元格值的二维数组 body.clear(); body.insertParagraph(0, `Data update: ${time}`).setHeading(DocumentApp.ParagraphHeading.HEADING1); table = body.appendTable(dataYouWant); // 将表格粘贴到文档中 table.getRow(0).editAsText().setBold(true); }

问题原因
原有脚本仅通过Sheets.Spreadsheets.Values.get接口获取了单元格纯文本值,完全没有拉取合并单元格规则、单元格背景色、字体样式、对齐方式等格式元数据。调用appendTable传入二维数组时,只会生成默认样式的无合并规则普通表格,自然无法保留原表格式。
修复方案
需要先读取源表格的合并单元格信息,在Docs中生成基础值表格后,手动合并对应位置的单元格;如果需要保留更多格式,可同步读取单元格样式属性后逐一设置到Docs表格对应位置,参考实现代码如下:
function copySheetToDocWithFormat() { // 请将以下参数替换为实际的文件ID、工作表名和复制范围 const SOURCE_SHEET_ID = "替换为你的源Google Sheets ID"; const TARGET_DOC_ID = "替换为你的目标Google Docs ID"; const SHEET_NAME = "Sheet1"; const COPY_RANGE = "A1:Z"; const spreadsheet = SpreadsheetApp.openById(SOURCE_SHEET_ID); const sheet = spreadsheet.getSheetByName(SHEET_NAME); const range = sheet.getRange(COPY_RANGE); const cellValues = range.getValues(); // 获取源表所有合并单元格的位置、尺寸信息 const mergedCellRules = sheet.getMergedRanges(); const doc = DocumentApp.openById(TARGET_DOC_ID); const body = doc.getBody(); // 生成更新时间 const updateTime = new Date().toLocaleString("id", { day: "2-digit", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit", second: "2-digit", timeZoneName: "short" }); body.clear(); body.insertParagraph(0, `Data update: ${updateTime}`).setHeading(DocumentApp.ParagraphHeading.HEADING1); // 插入带基础值的表格 const targetTable = body.appendTable(cellValues); // 同步合并单元格规则 mergedCellRules.forEach(mergedRange => { const rangeStartRow = mergedRange.getRow() - range.getRow(); const rangeEndRow = rangeStartRow + mergedRange.getNumRows() - 1; const rangeStartCol = mergedRange.getColumn() - range.getColumn(); const rangeEndCol = rangeStartCol + mergedRange.getNumColumns() - 1; // 仅处理复制范围内的合并单元格 if (rangeStartRow >= 0 && rangeStartCol >=0 && rangeEndRow < cellValues.length && rangeEndCol < cellValues[0].length) { const baseCell = targetTable.getCell(rangeStartRow, rangeStartCol); for (let r = rangeStartRow; r <= rangeEndRow; r++) { for (let c = rangeStartCol; c <= rangeEndCol; c++) { if (r === rangeStartRow && c === rangeStartCol) continue; baseCell.merge(targetTable.getCell(r, c)); } } } }); // 可在此处扩展其他格式同步逻辑:如单元格背景色、字体颜色、边框、对齐方式等 targetTable.getRow(0).editAsText().setBold(true); }
内容的提问来源于stack exchange,提问作者user15833970
相关产品推荐
相关产品推荐

