Range#sort无法根据新公式的值进行排序

问题描述 投票:0回答:1

我正在使用Google Apps脚本将数据从多个Google表格中提取到一张主表格中。要将日期转换为周数,我使用表格函数ISOWEEKNUM()作为第1列。我想按周数排序,因为标题我使用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-apps-script google-sheets
1个回答
1
投票

根本问题是Google is free to (and does) optimize their interpretation of your code避免滥用他们的服务器。当您调用对不同对象进行操作的函数时,Google并不总是确定订单很重要,因此可能会从(您所需的)订单中调用某些API操作。您可以通过在完全相同的对象上链接方法来帮助Google,但这并不总是足够的。导致副作用/异步更改的操作(例如编写公式或在不同的API上操作 - 例如在使用Form,Docs或Sheets Service方法后调用Drive API / Service)可能无法按顺序执行,即使“链接” “。

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

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

刷新写入高速缓存将强制在执行下一个脚本行之前计算写入的公式,使其值可用于排序方法。

© www.soinside.com 2019 - 2024. All rights reserved.