如何用Google Apps Script在Google Sheet中同时刷新单元格并写入值
问题根因
你的代码核心问题是最后一行的统计时机错误:
你在执行appendRow新增日期行之前,就已经把lr(表格最后一行号)、lc(表格最后一列号)存入变量。即便后续调用SpreadsheetApp.flush()把新增行同步到了表格,这两个变量存储的还是旧的数值,后续遍历行的循环上限是旧的行数,自然遍历不到刚新增的那一行,也就匹配不到新写入的new_date。
修复代码
function addItem(e){ // 补充定义ss变量,避免未定义报错 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('items'); const id = e.parameter.id; const qty = e.parameter.qty; const lc = sheet.getLastColumn(); let lr = sheet.getLastRow(); const data = sheet.getDataRange().getValues(); const old_date = data.pop()[0]; const new_date = e.parameter.date; if (old_date != new_date) { sheet.appendRow([new_date]); // 新增行后更新行数统计 lr += 1; } SpreadsheetApp.flush(); for (let i = 1; i <= lc; i++) { // 用更新后的lr作为循环上限,可遍历到新增行 for (let j = 1; j <= lr; j++) { const rid = sheet.getRange(1, i).getValue(); const red = sheet.getRange(j,1).getValue(); // 若存在日期格式不匹配问题,可统一转成字符串对比:String(rid) == String(id) && String(red) == String(new_date) if (rid == id && red == new_date){ sheet.getRange(j, i).setValue(qty); // 匹配到目标位置后直接跳出,减少不必要的遍历 return; } } } }
性能优化建议
你已经在代码开头通过getDataRange().getValues()拿到了全表的二维数组,后续完全可以直接在内存中匹配行列位置,不需要反复调用getRange()读写表格,运行速度会提升数倍,也不会出现统计时机错误的问题。
内容的提问来源于stack exchange,提问作者Linmeimei
相关产品推荐
相关产品推荐

