我管理一个包含多个工作表的Google电子表格。我使用脚本来自动化第一张纸上的某些过程。最近,一个用户不小心重命名了第一张工作表-因此脚本停止工作,直到我发现并更正了工作表的名称。
我的问题是:如何防止这种情况再次发生?有没有一种方法可以保护工作表名称不被我自己以外的用户更改?或者,在脚本中,不管其名称如何,有没有其他方法可以引用第一张纸?即,除了sheet.getSheetName之外,还有诸如sheet.getFirst之类的东西可以返回第一个工作表,而不管其名称如何?
这里是一个受影响脚本的示例。
function onOpen(){
//Sheet where this script should run
var SHEETNAME = "Scan IN Check OUT"
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
if (sheet.getSheetName() == SHEETNAME ) { //Check we are on the correct sheet
var sheet = SpreadsheetApp.getActiveSheet();
//Find the last cell with data in that specific column (A in this case)
var lastCell = sheet.getRange('A1').getNextDataCell(SpreadsheetApp.Direction.DOWN);
//Activate the next cell
lastCell.offset(1, 0).activate();
}
}
答案 0 :(得分:1)
SpreadsheetApp.getActive().getSheets()[0];
将始终是左侧的第一张工作表,可能并不总是同一张工作表,因为用户可以更改其位置。您可以使用下面的第一个功能来查看在移动表时索引如何变化。 警告:请勿在包含重要信息的电子表格中执行此操作,因为它首先会清除工作表,然后为所有工作表写上名称,ID和索引。
因此,您还可以使用第一个函数来获取您不想更改的工作表的ID。
第二个函数将通过id获取工作表。如果您要选择工作表的ID并将其替换为“我的工作表ID”字符串,并在显示我的工作表名称的位置放置正确的工作表名称,那么当您运行two()时,它将一直移动工作表左移(即索引1)并重命名为您想要的任何名称。
function runOne() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var sht=ss.getSheets();
sh.clear();
sh.appendRow(['Name','id','index']);
sht.forEach(function(s){
sh.appendRow([s.getName(),s.getSheetId(),s.getIndex()]);
});
}
function getSheetById(id) {
var id=id||'My Sheet ID';
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets();
for(var i=0;i<shts.length;i++) {
if(shts[i].getSheetId()==id) {
return shts[i];
}
}
}
function runTwo() {
var ss=SpreadsheetApp.getActive();
var sh=getSheetById().activate();
ss.moveActiveSheet(1);
sh.setName('My Sheet Name');
}
当然,这里的真正问题是,如果用户可以更改工作表的名称,他们也可以进入并更改您的脚本。