【问题标题】:Can I protect the name of a Google sheet? Or reference the sheet by position rather than name?我可以保护 Google 表格的名称吗?还是按位置而不是名称引用工作表?
【发布时间】:2019-12-29 18:49:36
【问题描述】:

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

【问题讨论】:

  • 在较早的帖子中,我发现建议使用基于时间的触发器每 5 分钟左右重命名工作表 (Zig Mandel)。我会试试看。
  • 我会确定您想要的工作表标签的 ID 号,然后使用 ID 号确定要获取的工作表选项卡。不幸的是,没有办法通过 ID 号获取工作表选项卡,因此您需要获取所有工作表选项卡,遍历它们并比较 ID 号,然后在找到具有正确 ID 号的工作表选项卡时停止循环.当该代码运行时,您还可以检查名称是否正确,如果不正确,则更改它。这样做可以避免触发器按时间间隔运行。
  • 谢谢!这就是我一直在寻找的。​​span>

标签: google-apps-script google-sheets


【解决方案1】:

SpreadsheetApp.getActive().getSheets()[0]; 将始终是左侧的第一个工作表,但可能并不总是同一个工作表,因为用户可以更改他们的位置。您可以使用下面的第一个函数来查看索引在您移动工作表时如何变化。 警告:不要在包含重要信息的电子表格中执行此操作,因为它首先清除工作表,然后为所有工作表写入名称、ID 和索引。
所以你也可以使用第一个函数来获取你不想改变的工作表的id。

第二个函数将通过 id 获取工作表。如果您选择工作表的 id 并用它替换字符串“我的工作表 ID”,并将工作表的正确名称放在我的工作表名称的位置,那么当您 runTwo() 时,它会一直移动您的工作表向左(即索引 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');
}

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

【讨论】:

  • 谢谢。好主意。是的。当我允许用户编辑工作表时,我冒着他们编辑脚本的风险。还没来得及想办法解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2015-06-17
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多