范围#排序无法根据新公式的值进行排序



我使用Google Apps脚本将几张Google表格中的数据提取到一个主表中。为了将日期转换为周数,我使用表1的表函数ISOWEEKNUM()。我想按周数进行排序,并且由于标题,我使用Range#sort

我遇到的问题是,当我测试运行 getData() 时,Range#sort调用没有效果。如果我第一次运行 getData() ,然后手动运行我的 sortRange() 函数,则可以工作。

在其中用ISOWEEKNUM()编写单元格,然后尝试直接在同一脚本执行中进行排序?在无需用户必须手动分类或启动更多脚本的情况下,该怎么办才能解决此问题?

function getData()
{
  var thisSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = thisSpreadSheet.getSheetByName('Data');
  var deliverySheets = listDeliverySheets();
  var outputWeekAndTotal = [];
  var outputCratesPerStore = [];
  var i;
  for(i = 0; i < deliverySheets.length; i++)
  {
    outputWeekAndTotal.push(["=ISOWEEKNUM(""+deliverySheets[i].getRange("A2").getDisplayValue()+"")", deliverySheets[i].getRange("L12").getValue()]);
    outputCratesPerStore.push(deliverySheets[i].getRange("L5:L9").getValues());    
  }
  dataSheet.getRange(2, 1, outputWeekAndTotal.length, outputWeekAndTotal[0].length)
    .setValues(outputWeekAndTotal);
  dataSheet.getRange(2, 3, outputCratesPerStore.length, outputCratesPerStore[0].length)
    .setValues(outputCratesPerStore);
  sortRange();
}
function sortRange()
{
  var thisSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var rangeToSort = thisSpreadSheet.getSheetByName('Data').getRange(2, 1, 7, 7); /*Constants used temporarily*/
  rangeToSort.sort({column: 1, ascending: true});
}

基本问题是Google可以自由(并确实)优化其对代码的解释,以避免滥用服务器。当您调用以不同对象运行的功能时,Google并不总是确定订单很重要,因此可以从(您需要的)订单中调用某些API操作。您可以通过将方法链接在完全相同的对象上来帮助Google,但这并不总是足够的。引起副作用/异步更改的操作,例如编写公式或通过不同的API进行操作 - 例如使用表单,文档或表服务方法在使用drive api/service来调用驱动器API/服务 - 即使"链接"。"

要解决此问题,您必须强行冲洗写入缓存缓冲区。对于电子表格服务,这是通过致电SpreadsheetApp#flush来完成的。

  ...
  dataSheet.getRange(...).setValues(...);
  SpreadsheetApp.flush();
  sortRange();
}

冲洗写作缓存将迫使书面公式在执行下一个脚本行之前要计算,从而使其值可用于排序方法。

最新更新