You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:03