Google apps script 谷歌应用程序脚本在循环中从/向工作表读写数据不起作用

Google apps script 谷歌应用程序脚本在循环中从/向工作表读写数据不起作用,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我试着用Google Sheets作为我的库存管理器。每次收到批量订单时,我都会通过for循环运行它们,并从另一张表中减少相应的库存。所以我使用“setValue”函数将数据写入工作表 这里的问题是,我在循环中读取当前库存,并在同一循环中写入减少的库存。然而,在循环完全结束之前,“setValue”似乎不起作用 比如说, Milk = 5 >>New orders arrived with this order (1 milk, 1 bread, 1 coffee, 1 milk)

我试着用Google Sheets作为我的库存管理器。每次收到批量订单时,我都会通过for循环运行它们,并从另一张表中减少相应的库存。所以我使用“setValue”函数将数据写入工作表

这里的问题是,我在循环中读取当前库存,并在同一循环中写入减少的库存。然而,在循环完全结束之前,“setValue”似乎不起作用

比如说,

Milk = 5
>>New orders arrived with this order (1 milk, 1 bread, 1 coffee, 1 milk)
因此,这里我将有一个循环,每个项目4

对于指数0,我从股票表(5)中读取当前股票。然后我检查新订单数量(1)。所以设置值(4)。 对于索引1,。。。 对于索引2,。。。 对于指数3,我从同一张股票表中读取当前股票。应该是4,但上面写着5。数据应该在3次递归之前写入

因此,最终结果是

Milk = 4
但它应该是

Milk = 3
希望我能告诉你这个问题。因此,setValue函数运行,但在循环结束之前,它不会影响相应的工作表。这就是为什么我不能将其用作实时数据库的原因。你以前遇到过这样的问题吗

代码如下所示

for(ordersArray){
  for(stocksArray){
    read stock from sheets
    calculate new stock quantity
    write new quantity with setValue //here this suppose to write on each loop but it writes only at the end of the loop
  }
}

我反复考虑这个想法,看看我是否可以很容易地用我处理电子表格的方式重现你所看到的问题。我有八列和1000行虚拟数据,我对每行执行了
“=SQRT(POW(SUM(A2:H2),2))”
计算。为了让它更具挑战性,我正在使用半随机数重新加载数据数组,并立即在没有SpreadsheetApp.flush()的情况下读取数据,然后在刷新后再次读取,然后比较最后21行总和,看看它们是否相同

function readandwriterealyfast() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()-1);
  let vs=rg.getValues();
  vs.forEach(function(r,i,A){
    let n=Math.floor(Math.random()*100);
    r.forEach(function(c,j){
       A[i][j]=i+n+1;
    });
  });
  rg.setValues(vs);
  let sums=sh.getRange(sh.getLastRow()-20,sh.getLastColumn(),21,1).getValues();
  SpreadsheetApp.flush();
  let sums2=sh.getRange(sh.getLastRow()-20,sh.getLastColumn(),21,1).getValues();
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(JSON.stringify(sums) + '<br />' + JSON.stringify(sums2)), "Sums");
  //=SQRT(POW(SUM(A2:H2),2))
}
我检查了电子表格中的数据,数据与之一致。我并不是说这不会发生。但我发现,当您倾向于最小化电子表格中使用的单元格函数数量时,速度非常快。在我的例子中,我几乎完全避免使用细胞功能,因为我不喜欢它们。(这是我个人的意见)


你可能想找个顾问来帮你做项目。也许可以做一些事情来为您的客户提供更好的结果,而无需付出太多额外的努力。

与任何技术一样,明智地使用它需要一些经验和理解。您完全正确,在没有电子表格app.flush()介入的情况下,向工作表写入数据,然后立即从中读取数据可能会导致问题,因为信息可能不正确,因为没有给电子表格足够的时间进行自我更新。这在基于服务器的技术中尤其重要。也许值得您花时间来看看,从谷歌应用程序脚本支持页面可以发布您所指的完整代码吗?您遇到的问题很可能与
从工作表读取库存
部分有关。此外,正如@Cooper所提到的,您可能需要查看应用程序脚本中的文档。
[[8080],[8048],[8376],[8008],[8136],[8024],[7880],[7920],[8048],[8328],[7992],[8528],[8344],[8336],[8312],[8128],[8328],[8424],[8072],[8680],[8688]]

[[8080],[8048],[8376],[8008],[8136],[8024],[7880],[7920],[8048],[8328],[7992],[8528],[8344],[8336],[8312],[8128],[8328],[8424],[8072],[8680],[8688]]