1

我正在为一个最终目标是完全自治的客户编写一些脚本——完成后,电子表格将永远有效。理想情况下,无论如何。

因为我需要来自其他工作表的信息,所以我必须以.getActiveSheet(). 因为客户可能会重新命名或重新排序工作表,所以即使在这些更改之后,我也必须以一种有效的方式访问工作表。这排除了getSheetByName()getSheets()[SHEET_NUMBER](同样,客户可能会重新命名或重新排序工作表)。但是,这应该是可能的,因为“gid”。每张工作表都有不同的 gid,当您重新排序或重新命名工作表时它们不会改变(滚动到每张工作表的 URL 末尾以了解我的意思)。

所有 URL 访问仅打开 FIRST 表。例如, SpreadsheetApp.openById(SHEET_ID).getDataRange().getValues() 返回第一张纸的值,即使我在末尾包含“gid”部分。与openById和相同openFile

所以我的问题是,我如何以一种即使在重命名工作表或重新排序电子表格中的工作表后仍能正常工作的方式访问工作表?

4

2 回答 2

2

没有方法,但您可以使用getSheetId()getSheetById构建自己的方法。这里:

function sheetsIdMap() {
  var sheetsById = {};
  SpreadsheetApp.getActive().getSheets().forEach(function(s){ sheetsById[s.getSheetId()] = s; });

  //just checking that it worked
  for( var id in sheetsById )
    Logger.log(id+' - '+sheetsById[id].getName());

  //usage example
  var sId2 = sheetsById[2];
  Logger.log('\n'+sId2.getName());
}

- 编辑

让我们尝试一个更直接的函数(虽然我不喜欢做这样的循环并且不将数据存储在地图上以供后续使用o(1))。

function getSheetById(ssID, sheetID) {
  var sheets = SpreadsheetApp.openById(ssID).getSheets();
  for( var i in sheets )
    if( sheets[i].getSheetId() == sheetID )
      return sheets[i];
  return null; //sheet id not found in spreadsheet, probably deleted?
}
于 2013-10-05T16:42:09.127 回答
1

是的,有一个工作表 ID。它的 sheet.getSheetId。此 id 可以从应用程序脚本中使用,也可以转换为“真实”gid 用于制作工作表 url。执行 (sheetId ^ 31578).toString(36) 以获取 gid。我必须对其进行反向工程才能得到它,我不能保证它会永远工作。

于 2013-10-05T16:29:47.273 回答