【问题标题】:Method "moveActiveSheet" doesn't work as expected in Google Apps Script (JavaScript)方法“moveActiveSheet”在 Google Apps 脚本 (JavaScript) 中无法按预期工作
【发布时间】:2016-04-16 18:13:24
【问题描述】:

我正在使用 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 中工作表数据的顺序不对应。

为什么这不起作用?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

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

    在此示例中,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);
      }
    

    我将应该在第一个位置的工作表放在最后一个位置,然后将下一个放在最后一个位置,依此类推,直到列表中的姓氏。最后,第一个实际上是第一位的。 (我希望这是可以理解的 ;-)

    【讨论】:

      【解决方案2】:

      接受的答案应该有效,但.moveActiveSheet() 方法中似乎有一个怪癖/错误:我有一个电子表格,其中两张纸与它们在排序数组中的位置相比总是会转置。日志显示它正在移动工作表 A,但它实际上将工作表 B 移动到工作表 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())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 2021-12-20
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        相关资源
        最近更新 更多