我写了一个Google脚本,将工作表(即标签)按字母顺序放在Google电子表格中。
问题在于,电子表格页面底部的选项卡水平列表未按字母顺序显示(从左到右)。
以“ firstSheet”开头的标签通常会在脚本在“包”中间的某个位置运行后结束,并且字母顺序将从此处开始并“环绕”直到字母中的最后一个标签列表就在它之前。 (我之所以说“一般”,是因为有时它的确会一直出现在左侧,具体取决于它的开始位置。)
我还应该提到该脚本已绑定到电子表格,并由用户作为“自定义”菜单项触发。
我正在使用的基本脚本是帽子提示@ Serge-insas(Method "moveActiveSheet" doesn't work as expected in Google Apps Script (JavaScript))。我对该脚本所做的唯一真正的修改就是添加一行,以在过程结束时显示第一个alpha选项卡。
我还为整个问题添加了一个侧边栏,作为解决上述“包装”问题的解决方法,因为我发现侧边栏有一个右键单击“重新加载”选项,它会重新加载电子表格并重新加载显示标签按从左到右的正确字母顺序排列。
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom')
.addItem('Sort Sheets', 'sortSheets')
.addToUi();
function sortSheets () {
var html = HtmlService.createHtmlOutputFromFile('index')
.setTitle('Read Me')
.setWidth(300);
SpreadsheetApp.getUi()
.showSidebar(html); var ss = SpreadsheetApp.getActive();
var sheets = ss.getSheets();
var firstSheet = sheets[0].getName();
var numSheets = ss.getNumSheets();
var sheetNameArray = [];
for (var i = 0; i < numSheets; i++) {
sheetNameArray.push(sheets[i].getName());
}
var sheetNameArray = sheetNameArray.sort();
for(var s=0 ; s < numSheets ; s++){
ss.setActiveSheet(ss.getSheetByName(sheetNameArray [s]));
SpreadsheetApp.flush();
Utilities.sleep(50);
ss.moveActiveSheet(numSheets);
SpreadsheetApp.flush();
Utilities.sleep(50);
}
ss.setActiveSheet(ss.getSheetByName(firstSheet));
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<center><font color = red>IMPORTANT<br><br>
Once the routine has run (i.e., the tabs stop moving around) and you see the "saved" notification at the top of the page...<br><br>
Right click anywhere in this sidebar. Then select the "reload" menu item to reset sheet tabs in alpha order.</center></font> <br> <br>
</body>
</html>
所以我的问题是:除了侧边栏之外,是否有其他方法可以使重新加载发生?即,是否可以在脚本上使用一些命令,而不必使用相当复杂的侧边栏方法?边栏中有一个重新加载功能的事实使我希望找到一种以编程方式获取它的方法,尽管在搜索Google GAS文档时仍无法找到它。
答案 0 :(得分:0)
看起来您的代码应该可以工作。不知道为什么不是。但是,这是订购工作表的更简单方法。
function sortSheets()
{
// get the current spreadsheet
var ss = SpreadsheetApp.getActive();
// get an array of sheets
var allSheets = ss.getSheets();
// sort the array by sheet name
allSheets.sort(function(s1, s2){
if(s1.getName().toLowerCase() < s2.getName().toLowerCase()) return -1;
if(s1.getName().toLowerCase() > s2.getName().toLowerCase()) return 1;
return 0;
});
// move the sheet into where they should be based on sorted order
allSheets.forEach(function(sheet, sheetIndex){
ss.setActiveSheet(sheet);
ss.moveActiveSheet(sheetIndex + 1);
});
}