方法“moveActiveSheet”在Google Apps脚本(JavaScript)中无法正常工作

时间:2016-04-16 18:13:25

标签: google-apps-script google-sheets

我正在使用Google Apps脚本编写脚本。

目标:允许用户按照每张表格中的日期对Google电子表格中的表格/标签进行排序。

function sorter() {
  var sp = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = sp.getSheets();
  var sheet_metadata = get_and_sort_sheet_metadata(sheets)
  for( var j = 0; j < sheet_metadata.length; j++ ) {
    sp.setActiveSheet(sp.getSheetByName(sheet_metadata[j].name));
    sp.moveActiveSheet(j + 1);    
  }
}

这是sheet_metadata内容的一个示例:

[{date=false, name=A, index=1}, {date=false, name=B, index=2}, {date=1.391058E12, name=ARCHIVE: xname0 name: 1/30/2014 ID:145952, index=8}, {date=1.42173E12, name=ARCHIVE: zname1 name: 1/20/2015 ID:1459527232, index=7}, {date=1.4543892E12, name=ARCHIVE: wname3 name: 2/2/2016 ID:145952723299, index=6}, {date=1.4544756E12, name=ARCHIVE: dname4 name: 2/3/2016 ID:145952723266, index=5}, {date=1.454562E12, name=ARCHIVE: qname5 name: 2/4/2016 ID:1459500, index=4}, {date=1.4546484E12, name=ARCHIVE: qname6 name: 2/5/2016 ID:1459500, index=3}]

日期值是.getTime()的结果。名称是工作表的名称。索引是工作表的原始索引。此数组中对象的顺序是工作表的顺序。

sheet_metadata中的对象始终处于正确的顺序。但是,for循环(参见上文)无法以正确的顺序放置纸张。

换句话说,工作表最终的顺序与sheet_metadata中工作表数据的顺序不对应。

为什么这不起作用?

2 个答案:

答案 0 :(得分:4)

几天前我遇到了同样的问题,我找到了一种方法来使用这段代码:

在这个示例中,profSheets是按照我想要的方式排序的工作表名称数组。

  var pos = ss.getNumSheets();
  for(var s=0 ; s < profSheets.length ; s++){
    var sh = ss.setActiveSheet(ss.getSheetByName(profSheets[s]));
    SpreadsheetApp.flush();
    Utilities.sleep(200);
    ss.moveActiveSheet(pos);
    SpreadsheetApp.flush();
    Utilities.sleep(200);
  }

我将应该位于第一个位置的纸张放在最后一个位置,然后将最后一个位置放在最后一个位置,依此类推到列表中的最后一个名称。最后,第一个实际上是第一个。 (我希望这是可以理解的; - )

答案 1 :(得分:1)

可接受的答案应该起作用,但是.moveActiveSheet()方法中似乎存在一个古怪/错误:我有一个电子表格,其中两个工作表与它们在已排序数组中的位置相比总是最终转置。日志显示它正在移动Sheet A,但实际上它是在将Sheet B移动到Sheet A的位置,反之亦然。

为了其他任何人遇到此问题,这里是在电子表格中对工作表进行排序的另一种方法,由于某种原因,它没有相同的问题。它要求您打开Sheets API(资源|高级Google服务...):

var SS = SpreadsheetApp.getActive();
var sheets = SS.getSheets().sort(sortFunction); // specify a sortFunction

var requests = sheets.map(function(sheet, index){
  return {
    "updateSheetProperties": {
      "properties": {
        "sheetId": sheet.getSheetId(),
        "index": index
      },
      "fields": "index"
    }
  }
})

Sheets.Spreadsheets.batchUpdate({"requests": requests}, SS.getId())
相关问题