如何用Apps Script按Google Sheets M-Front表条件复制行到M-Items
function copyOldRevisionItems() { // 请替换为你的表格ID const SPREADSHEET_ID = '1Zgs1jzjIeaBpd5Ms7emQgxhVJBMtlEOlDNDfxlhSRiY'; // 请根据你的实际列位置调整,以下默认报价编号在两张表的A列 const FRONT_QUOTE_COL = 1; const ITEMS_QUOTE_COL = 1; const ss = SpreadsheetApp.openById(SPREADSHEET_ID); const frontSheet = ss.getSheetByName('M-Front'); const itemsSheet = ss.getSheetByName('M-Items'); // 1. 获取M-Front最新的报价编号 const frontLastRow = frontSheet.getLastRow(); const newQuoteNum = frontSheet.getRange(frontLastRow, FRONT_QUOTE_COL).getValue().toString(); // 2. 拆分得到基础编号和上一版本编号 const quoteParts = newQuoteNum.split('-Rev.'); if (quoteParts.length < 2) return; // 不符合编号格式直接终止 const baseQuote = quoteParts[0]; const newRev = parseInt(quoteParts[1]); const oldRevNum = newRev - 1; if (oldRevNum < 0) return; // 初始版本Rev.0不需要复制旧数据 const oldQuoteNum = `${baseQuote}-Rev.${oldRevNum}`; // 3. 从M-Items中筛选所有旧版本对应的行 const itemsAllData = itemsSheet.getDataRange().getValues(); const copyRows = []; itemsAllData.forEach(row => { if (row[ITEMS_QUOTE_COL - 1] === oldQuoteNum) { // 数组下标从0开始,所以列号减1 const newRow = [...row]; // 复制整行数据 newRow[ITEMS_QUOTE_COL - 1] = newQuoteNum; // 替换为新的报价编号 copyRows.push(newRow); } }); if (copyRows.length === 0) return; // 没有匹配到旧版本数据直接终止 // 4. 批量写入新数据到M-Items末尾 itemsSheet.getRange( itemsSheet.getLastRow() + 1, 1, copyRows.length, copyRows[0].length ).setValues(copyRows); }
使用说明
- 列位置调整:如果你的报价编号不在A列,修改代码开头的
FRONT_QUOTE_COL(M-Front表的报价编号所在列)、ITEMS_QUOTE_COL(M-Items表的报价编号所在列)为对应数字即可。 - 触发器设置:打开脚本编辑器左侧的「触发器」面板,点击「添加触发器」,选择函数为
copyOldRevisionItems,事件来源选择「电子表格」,事件类型选择「更改」,保存后即可实现新增修订号时自动复制商品项。
原脚本问题说明
getLastRow是方法需要加括号调用,原代码未加括号无法获取到正确的最后行行号- 缺少新旧修订号的匹配逻辑,也没有对复制后的行的报价编号进行替换
- 重复调用
getValues会拉低运行效率,本方案优化为一次性读取全表数据后在内存中处理,速度更快
内容的提问来源于stack exchange,提问作者Biha
相关产品推荐
相关产品推荐

