首页 > 解决方案 > Javascript 术语 - 工作表是对象吗?

问题描述

我一直在使用 GAS,但没有强大的 Javascript 背景,并且在忽略大小写的情况下按字母顺序排序工作表时遇到了问题。我做了一些搜索,并根据 SO 中的其他公开答案和其他一些来源组合了这种方法。假设我的床单被命名为“Sheet1”、“我的另一张床单”、“第三张床单”、“另一张床单”、“天哪,另一张床单?”。我希望订购我的床单:“另一张床单”、“天哪,另一张床单?”、“我的另一张床单”、“Sheet1”、“第三张床单”

var spsheet = SpreadsheetApp.getActive()
var sheets = spsheet.getSheets()
var names =[]
sheets.forEach(function(item){
  names.push(item.getName())
})
var sortednames = names.sort(function(a,b){
   return ((a.toUpperCase() > b.toUpperCase()) ? 1:-1)

  {)

我是不是误会了?我认为 toUpperCase() 调用会临时更改每个名称的大小写,仅用于排序目的,然后按字母顺序对工作表名称进行排序,然后返回忽略大小写的工作表排序列表。但是,实际输出是:[By gosh another one?, Sheet1, The 3rd Sheet, another sheet, my Other Sheet]

似乎我首先按字母顺序对大写工作表进行排序,然后使用小写排序进行排序。我在正确的轨道上吗?还是我完全误解了什么?

标签: javascriptsortinggoogle-apps-script

解决方案


尝试这个:

function sortSheetsByNameCaseInsensitive() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var nameA=shts.map(function(sh,i){return sh.getName()});
  var nameB=shts.map(function(sh,i){return sh.getName().toLowerCase()});
  var nameC=nameB.slice();
  nameC.sort();
  for(var i=0;i<nameC.length;i++) {
    var sh=ss.getSheetByName(nameC[i]);
    var idx=nameB.indexOf(nameC[i]);
    sh.setName(nameA[idx]);
    Sheets.Spreadsheets.batchUpdate({requests:[{"updateSheetProperties":{"properties":{"sheetId":sh.getSheetId(),"index":i+1},"fields":"index"}}]}, ss.getId());
  }
}

推荐阅读