Google Sheets脚本修改:状态变更时仅移动指定列至另一工作表
解决方案
你需要先把要提取的列转换成对应的数字索引(A=1,B=2,D=4,F=6,G=7,H=8,M=13),然后从源行中筛选这些列的数据,再写入目标工作表。以下是修改后的完整代码:
// 请根据你的实际表格配置修改这些变量 const statusColumn = 3; // 示例:如果状态列是C列就填3 const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("源表名称"); const destinationSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("目标表名称"); function onEdit(e) { var editedRange = e.range; var editedRow = editedRange.getRow(); // 跳过表头行(如果你的表头在第1行) if (editedRow === 1) return; if (editedRange.getColumn() === statusColumn) { var status = editedRange.getValue(); if (status === "Closed/Won") { // 定义需要提取的列索引(对应A、B、D、F、G、H、M) const targetColumns = [1, 2, 4, 6, 7, 8, 13]; // 获取源行的所有数据(转成一维数组) const rowData = sourceSheet.getRange(editedRow, 1, 1, sourceSheet.getLastColumn()).getValues()[0]; // 筛选出需要的列数据(数组是0索引,所以列索引要减1) const filteredData = targetColumns.map(colIndex => rowData[colIndex - 1]); // 避免写入完全空的行 if (filteredData.some(cell => cell !== "")) { // 把筛选后的数据追加到目标表最后一行 destinationSheet.appendRow(filteredData); // 如果需要移动后删除源行,取消下面这行注释 // sourceSheet.deleteRow(editedRow); } } } }
关键修改说明:
- 指定目标列:用
targetColumns数组存储你需要的列对应的数字索引,表格列从1开始计数。 - 筛选数据:先获取整行的所有数据(转成一维数组),再通过
map方法筛选出需要的列,这里要注意数组是0索引,所以列索引要减1才能对应上。 - 写入目标表:用
appendRow方法直接把筛选后的数组写入目标表的最后一行,比原来的copyTo更灵活,适合只写部分列的场景。 - 空行判断:用
some方法检查筛选后的数据是否有非空内容,避免写入完全空的行。
注意:请根据你的实际表格,修改statusColumn、源表和目标表的名称。如果需要移动后删除源行,取消sourceSheet.deleteRow(editedRow)的注释即可。
内容的提问来源于stack exchange,提问作者CunningGoose
相关产品推荐
相关产品推荐

