按日期重新排列Google表格工作表

时间:2019-12-11 17:54:21

标签: google-apps-script google-sheets

我有一本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步均无法按预期进行的指导将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

您需要获取工作表ID的值。

  var FutureSheets = ss.getRangeByName("FutureSheetIDs").getValues();

此外,请注意,.getSheetByID('')不存在。您必须进行第二次循环,然后根据其ID根据名称选择工作表。

此外,我之前做过类似的事情,但是如果有大量的工作表,则工作表实际上没有更新其位置时出现了问题。这似乎是由于追逐问题造成的,.flush()并没有产生影响。必须使用F5刷新工作表

Script to rename & reorder sheets based on table

答案 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)
    }
  }
}