我有一本Google表格工作簿,其中有多个按日期命名的工作表。我正在尝试使用Google Apps脚本来1)以相反的时间顺序对这些工作表重新排序,然后2)然后将所有将来的工作表移动到工作簿的末尾,因此第一工作表始终是最新的工作表过去的日期。
第1步可以使用以下代码正常运行:
function sortGoogleSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Store all the worksheets in this array
var sheetNameArray = [];
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
sheetNameArray.push(sheets[i].getName());
}
sheetNameArray.sort().reverse();
// Reorder the sheets.
for( var j = 0; j < sheets.length; j++ ) {
ss.setActiveSheet(ss.getSheetByName(sheetNameArray[j]));
ss.moveActiveSheet(j + 1);
}
}
但是第2步无法将将来的图纸移到末尾。没有生成错误,但工作表顺序不变。 “ FutureSheetIDs”是一个单列命名范围,其中包含日期为>今天(即要移至工作簿末尾)的工作表ID(例如938739529、532578283等)。
function resortFutureSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var pos = ss.getNumSheets();
var FutureSheets = ss.getRangeByName("FutureSheetIDs");
for(var s=0 ; s < FutureSheets.length ; s++){
var sh = ss.setActiveSheet(ss.getSheetByID(FutureSheets[s]));
SpreadsheetApp.flush();
Utilities.sleep(200);
ss.moveActiveSheet(pos);
SpreadsheetApp.flush();
Utilities.sleep(200);
}
}
任何关于为什么第2步均无法按预期进行的指导将不胜感激。谢谢!
答案 0 :(得分:0)
您需要获取工作表ID的值。
var FutureSheets = ss.getRangeByName("FutureSheetIDs").getValues();
此外,请注意,.getSheetByID('')
不存在。您必须进行第二次循环,然后根据其ID根据名称选择工作表。
此外,我之前做过类似的事情,但是如果有大量的工作表,则工作表实际上没有更新其位置时出现了问题。这似乎是由于追逐问题造成的,.flush()
并没有产生影响。必须使用F5刷新工作表
答案 1 :(得分:0)
虽然很有气质,但这似乎是最好的解决方案:
function resortFutureSheets(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var pos = ss.getNumSheets();
var FutureSheets = ss.getRangeByName("FutureSheetNames");
var FutureSheetsArray = FutureSheets.getValues();
for(var s = 0 ; s < FutureSheets.length; s++) {
ss.setActiveSheet(ss.getSheetByName(FutureSheetsArray[s]));
SpreadsheetApp.flush();
Utilities.sleep(200);
ss.moveActiveSheet(pos);
SpreadsheetApp.flush();
Utilities.sleep(200);
}
}
答案 2 :(得分:0)
尝试使用Sheets API集成到Apps脚本中的Advanced Sheets Service。
您可以检索和修改工作表ID 和工作表索引,如documentation中所指定:
电子表格中工作表的索引。添加或更新时 工作表属性,如果排除此字段,则添加工作表或 移动到工作表列表的末尾。更新工作表索引或 插入工作表时,将在“移动之前”索引中考虑移动。 例如,如果有3张纸(S1,S2,S3)以便移动S1 在S2之前,索引必须设置为2。工作表索引更新 如果请求的索引与工作表相同,则忽略该请求 当前索引,或者请求的新索引等于当前索引 工作表索引+ 1。
因此,对于您的请求,修改工作表的索引会很有用,您可以使用
enabling高级表格服务之后,您可以按以下方式更改表格的索引(=位置):
function myFunction() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var FutureSheets=ss.getRangeByName("FutureSheets");
var FutureIds=FutureSheets.getValues();
var spreadsheetId=ss.getId();
var sheets=ss.getSheets();
for(s=0;s<FutureIds.length;s++) {
if(FutureIds[s][0]==0){
break;
}else{
var resource = {
"requests": [
{
"updateSheetProperties": {
"fields": "index",
"properties": {
"sheetId": FutureIds[s][0],
"index": sheets.length
}
}
}
]
}
Sheets.Spreadsheets.batchUpdate(resource, spreadsheetId)
}
}
}