javascript - 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]
似乎我首先按字母顺序对大写工作表进行排序,然后使用小写排序进行排序。我在正确的轨道上吗?还是我完全误解了什么?
解决方案
尝试这个:
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());
}
}
推荐阅读
- r - 将误差线与条形图因子水平对齐
- outlook-addin - 如何避免为线程中的所有消息添加标记类别?
- regex - 正则表达式删除论坛上的空格
- webusb - USB 设备接口已被阻止
- excel - What VBA event allows to capture click value of ActiveX combobox?
- javascript - KendoUI:kendo.ui.VirtualList 不是构造函数
- python-3.x - How to find out the installed (Python) libraries in Visual Studio Code
- cors - 具有大量客户端的 API 的 CORS 标头
- php - 保存带有“刨花”字样的帖子时禁止 403。
- node.js - How can I create an Elasticsearch Query DSL for finding objects with empty array OR a value in same object