我正在使用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 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();
}
刷新写入高速缓存将强制在执行下一个脚本行之前计算写入的公式,使其值可用于排序方法。