我可以保护Google工作表的名称吗?还是按位置而不是名称来引用工作表?

时间:2019-12-29 18:49:36

标签: google-apps-script google-sheets

我管理一个包含多个工作表的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();
} 
}

1 个答案:

答案 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');
}
  

当然,这里的真正问题是,如果用户可以更改工作表的名称,他们也可以进入并更改您的脚本。