You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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();
}

核心修改点

  1. 行筛选逻辑:

    • 自动获取表格完整数据区域,避免硬编码行数的局限性
    • 保留表头行,同时精准筛选出G列(数组索引6)值为true的数据行
    • 只提取A-F列内容,排除无关列
  2. 精准插入表格:

    • 通过findText定位%table%标记的具体位置
    • 删除标记后在原位置插入表格,替代原脚本的末尾追加逻辑,符合模板排版需求
  3. 代码优化:

    • 将固定变量替换逻辑改为数组循环,提升代码可维护性
    • 同步筛选并应用原表格的背景色、字体样式、对齐方式,保证转移后的表格样式与原表格一致

内容的提问来源于stack exchange,提问作者Владислав Воронин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:02:34