修改Google Apps脚本:按条件转移表格至Docs指定位置
Google Apps脚本修改方案
需求说明
- 仅同步Google Sheets中**G列值为
true**的行及对应A-F列内容到Google Docs - 将生成的表格插入到Docs模板的
%table%标记位置,而非文档末尾
修改后的完整脚本
function actGeneration() { // 文档与文件夹配置 const docTemplateId = "183tq6LvgBhzfbWUpNCWAV0X6Tn49yJ1KGuwKTfiSQJs"; // 模板ID const tempFolderId = "1AgokTJRgvuMdVO_X3sO-S22Nvp5s0i2U"; // 新文档存储文件夹ID const tempFile = DriveApp.getFileById(docTemplateId).makeCopy(tempFolderId); const tempDoc = DocumentApp.openById(tempFile.getId()); const body = tempDoc.getBody(); // 替换模板固定变量 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const replacements = [ { tag: "%дата%", range: sheet.getRange(6, 9) }, { tag: "%номер%", range: sheet.getRange(2, 9) }, { tag: "%заказчик%", range: sheet.getRange(4, 9) }, { tag: "%адрес%", range: sheet.getRange(3, 9) }, { tag: "%стоимость%", range: sheet.getRange(5, 9) }, { tag: "%дата.договора%", range: sheet.getRange(6, 9) }, { tag: "%пропись%", range: sheet.getRange(5, 10) } ]; replacements.forEach(item => { body.replaceText(item.tag, item.range.getValue()); }); // 处理表格数据:筛选G列值为true的行 const dataRange = sheet.getDataRegion(SpreadsheetApp.Dimension.ROWS); // 获取完整数据区域 const allValues = dataRange.getValues(); const allBackgrounds = dataRange.getBackgrounds(); const allStyles = dataRange.getTextStyles(); const allAlignments = dataRange.getHorizontalAlignments(); // 筛选逻辑:保留表头(第1行)+ G列(索引6)为true的行 const filteredRows = []; const filteredBackgrounds = []; const filteredStyles = []; const filteredAlignments = []; allValues.forEach((row, index) => { // 表头直接保留,数据行判断G列是否为true if (index === 0 || row[6] === true) { filteredRows.push(row.slice(0, 6)); // 只取A-F列内容 filteredBackgrounds.push(allBackgrounds[index].slice(0, 6)); filteredStyles.push(allStyles[index].slice(0, 6)); filteredAlignments.push(allAlignments[index].slice(0, 6)); } }); // 配置列宽(对应A-F列) const colWidths = []; for (let col = 1; col <= 6; col++) { colWidths.push(sheet.getColumnWidth(col) * 3 / 4); } // 在%table%标记位置插入表格 const tableTag = "%table%"; const searchResult = body.findText(tableTag); if (searchResult) { const element = searchResult.getElement(); const parent = element.getParent(); // 删除标记文本 element.removeFromParent(); // 插入筛选后的表格 const table = parent.insertTable(0, filteredRows); table.setBorderWidth(1); // 设置列宽 colWidths.forEach((width, index) => { table.setColumnWidth(index, width); }); // 应用单元格样式 for (let i = 0; i < table.getNumRows(); i++) { const row = table.getRow(i); for (let j = 0; j < row.getNumCells(); j++) { const cell = row.getCell(j); const styleAttrs = {}; styleAttrs[DocumentApp.Attribute.BACKGROUND_COLOR] = filteredBackgrounds[i][j]; styleAttrs[DocumentApp.Attribute.FONT_SIZE] = filteredStyles[i][j].getFontSize(); styleAttrs[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = filteredAlignments[i][j]; if (filteredStyles[i][j].isBold()) { styleAttrs[DocumentApp.Attribute.BOLD] = true; } cell.setAttributes(styleAttrs); } } } tempDoc.saveAndClose(); }
核心修改点
行筛选逻辑:
- 自动获取表格完整数据区域,避免硬编码行数的局限性
- 保留表头行,同时精准筛选出G列(数组索引6)值为
true的数据行 - 只提取A-F列内容,排除无关列
精准插入表格:
- 通过
findText定位%table%标记的具体位置 - 删除标记后在原位置插入表格,替代原脚本的末尾追加逻辑,符合模板排版需求
- 通过
代码优化:
- 将固定变量替换逻辑改为数组循环,提升代码可维护性
- 同步筛选并应用原表格的背景色、字体样式、对齐方式,保证转移后的表格样式与原表格一致
内容的提问来源于stack exchange,提问作者Владислав Воронин
相关产品推荐
相关产品推荐

