修改Google Apps Script实现Sheet数据更新/追加功能
修改后的Google Apps Script脚本(支持Code匹配替换/追加)
原脚本可将JSON数据追加到Google Sheet最后一行,现优化为以下逻辑:
- 检查JSON数据中
Code字段(对应Sheet的B列) - 若Sheet中已存在相同Code值,替换对应整行数据
- 若不存在,将数据追加至Sheet末尾
function doPost(request = {}) { const { parameter, postData: { contents, type } = {} } = request; const { dataReq = [], fname = '' } = JSON.parse(contents); const response = { status: "function not found: " + fname, data2: dataReq } let output; switch (fname) { case 'pasteData': output = JSON.stringify(pasteData(dataReq)); break; default: output = JSON.stringify(response); break; } return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JSON); } function pasteData(dataReq) { const id = '1_27rjNQmlXrwVKpLWUbGrJYPJufGRa7Dk-XEKcNAHr0'; const sheet = SpreadsheetApp.openById(id).getSheetByName('Sheet1'); const headings = sheet.getDataRange().getValues()[0]; // 获取Code列的索引(B列对应数组索引1) const codeColIndex = headings.indexOf('Code'); if (codeColIndex === -1) { return 'Error: Sheet中未找到"Code"表头'; } // 构建现有Code与行号的映射表(跳过表头行) const allData = sheet.getDataRange().getValues(); const codeRowMap = new Map(); for (let i = 1; i < allData.length; i++) { const code = allData[i][codeColIndex]; if (code) { codeRowMap.set(code, i + 1); // 行号从1开始计数 } } let updateCount = 0; const newRows = []; // 逐个处理传入的JSON数据项 dataReq.forEach(item => { // 将数据项转换为对应表头的行数据 const rowData = headings.map(heading => item[heading] || ''); const itemCode = rowData[codeColIndex]; if (!itemCode) { // 无Code值的数据直接追加 newRows.push(rowData); return; } if (codeRowMap.has(itemCode)) { // 匹配到现有Code,替换对应行 const targetRow = codeRowMap.get(itemCode); sheet.getRange(targetRow, 1, 1, rowData.length).setValues([rowData]); updateCount++; } else { // 无匹配Code,加入待追加列表 newRows.push(rowData); } }); // 批量追加新数据 if (newRows.length > 0) { const startRow = sheet.getLastRow() + 1; sheet.getRange(startRow, 1, newRows.length, newRows[0].length).setValues(newRows); } return `更新行数:${updateCount},追加行数:${newRows.length}`; }
关键改动说明
- 新增
codeRowMap映射表,一次性读取现有Code与行号的对应关系,避免重复遍历Sheet提升效率 - 单独处理每个数据项,根据Code匹配结果执行替换或追加操作
- 增加表头合法性检查,若Sheet无"Code"表头直接返回错误提示
- 修正原函数名拼写不一致问题(
pasteDAta改为pasteData)
内容的提问来源于stack exchange,提问作者Far
相关产品推荐
相关产品推荐

