Google Sheets OnEdit:状态列输入yes时提取行数据生成JSON
Google Sheets OnEdit触发器实现状态触发生成JSON方案
完全可以实现,使用简单触发器自带的事件对象即可完成需求,不需要额外授权。
核心逻辑
- 校验编辑位置:确认触发编辑的单元格在指定状态列,且编辑区域为单个单元格、位于表头行下方
- 校验编辑值:确认单元格输入内容为
yes - 读取行数据:一次性拉取触发单元格所在行的其余列数值,避免多次调用表格API降低性能
- 赋值变量+生成JSON:按列顺序提取对应值赋值给变量,组装为结构化JSON块
完整可运行代码
function onEdit(e) { // 容错:非触发器触发场景直接退出 if (!e || !e.range) return; const editRange = e.range; const sheet = editRange.getSheet(); // ========== 配置项,根据自身表格结构修改 ========== const STATUS_COL = 4; // 状态列列号,示例中D列对应数值4,A=1、B=2以此类推 const HEADER_ROW = 2; // 表头所在行号,数据行从该行下方开始识别 // ================================================= // 批量编辑多单元格时不触发逻辑 if (editRange.rowStart !== editRange.rowEnd || editRange.columnStart !== editRange.columnEnd) return; // 编辑位置不在状态列、或编辑的是表头行时直接退出 if (editRange.getColumn() !== STATUS_COL || editRange.getRow() <= HEADER_ROW) return; // 编辑值不是yes时退出,已做去空格、忽略大小写处理 const inputVal = e.value ? e.value.trim().toLowerCase() : ''; if (inputVal !== 'yes') return; // 获取触发逻辑的当前行号 const currentRow = editRange.getRow(); // 一次性读取当前行A列到状态列前一列的所有值 const rowContent = sheet.getRange(currentRow, 1, 1, STATUS_COL - 1).getValues()[0]; // 按列顺序给对应变量赋值,索引从0开始对应A列、1对应B列以此类推 const orange_var = rowContent[0]; const apple_var = rowContent[1]; const banana_var = rowContent[2]; // 组装结构化JSON const targetJson = { ingredients1: orange_var, ingredients2: apple_var, ingredients3: banana_var, sourceRow: currentRow }; // 后续自定义逻辑写在这里,比如打印日志、写入其他表、发送接口请求等 console.log('生成的JSON块:', targetJson); // 示例:将JSON字符串写入状态列右侧相邻单元格 // editRange.offset(0, 1).setValue(JSON.stringify(targetJson)); }
使用说明
- 修改配置项的
STATUS_COL和HEADER_ROW匹配自身表格结构即可,比如状态列是E列就把STATUS_COL改为5 - 如果需要严格匹配大小写(只识别小写
yes,不识别YES/Yes),去掉代码里的.toLowerCase()即可 - 新增字段直接在
targetJson对象中添加键值对即可,对应列的数值按索引从rowContent中取 - 不要逐列调用
getValue()读取数据,一次性拉取整行数据的执行效率高很多,不容易触发脚本执行超时
内容的提问来源于stack exchange,提问作者chocokoala
相关产品推荐
相关产品推荐

