如何用Apps Script实现Google Sheet多表按条件复制行并递增报价版本号
针对Google Sheets报价单版本迭代的Apps Script解决方案
原代码问题梳理
- 读写逻辑不符合需求:你需要的是同工作表内复制符合条件的行到表尾,原代码是跨两个不同的Spreadsheet文件读写,完全不匹配使用场景
- 条件判断存在语法错误:
if (testvalue[i] /= 0)是赋值操作,不是相等判断,无法实现匹配指定报价编号的功能 - 缺失核心逻辑:没有报价编号版本号自增的处理步骤
- 运行效率低下:直接读取整列数据,会加载大量无效空行,拖慢脚本执行速度
可用实现代码
以下代码已适配你当前优先针对M-Items工作表实现功能的需求:
function upgradeQuoteRevision() { // 可修改配置项 const OLD_QUOTE_ID = "GE-2108-0271-Rev.0"; // 替换为你需要迭代的旧报价编号 const QUOTE_COLUMN = 2; // 报价编号存储在第2列(B列),无需改动 const TARGET_SHEET = "M-Items"; // 目标工作表名,无需改动 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(TARGET_SHEET); const lastRow = sheet.getLastRow(); const lastCol = sheet.getLastColumn(); // 仅读取有效数据范围,优化运行效率 const allRowData = sheet.getRange(1, 1, lastRow, lastCol).getValues(); const newRowsToInsert = []; allRowData.forEach(row => { // 匹配旧报价编号 if (row[QUOTE_COLUMN - 1] === OLD_QUOTE_ID) { const copyRow = [...row]; // 版本号自动加1 const oldRevNum = parseInt(OLD_QUOTE_ID.split("Rev.")[1]); const newQuoteId = OLD_QUOTE_ID.replace(`Rev.${oldRevNum}`, `Rev.${oldRevNum + 1}`); copyRow[QUOTE_COLUMN - 1] = newQuoteId; newRowsToInsert.push(copyRow); } }); // 批量写入新行到表尾 if (newRowsToInsert.length > 0) { sheet.getRange(lastRow + 1, 1, newRowsToInsert.length, newRowsToInsert[0].length).setValues(newRowsToInsert); } }
扩展多工作表处理说明
如果需要同时处理多个工作表,只需要修改配置项,增加循环逻辑即可:
- 将
TARGET_SHEET替换为工作表名数组:const TARGET_SHEETS = ["工作表1", "工作表2", "工作表3"] - 在外层加一层循环遍历
TARGET_SHEETS,对每个工作表执行上述处理逻辑即可
注意事项
- 首次运行前请备份表格数据,避免误操作导致数据丢失
- 如果报价编号的命名规则有调整,对应修改版本号拆分的逻辑即可
内容的提问来源于stack exchange,提问作者Biha
相关产品推荐
相关产品推荐

