我正在为客户编写一些脚本,其最终目标是完全自治 - 完成后,电子表格将永远有效。理想情况下,无论如何。
因为我需要来自其他工作表的信息,所以我必须以.getActiveSheet()
以外的方式访问它们。由于客户端可能会重新命名或重新排序工作表,因此我必须以一种即使在这些更改后也能正常工作的方式访问工作表。这排除了getSheetByName()
和getSheets()[SHEET_NUMBER]
(同样,客户端可能会重新命名或重新排序表单)。但是,由于“gid”,它应该。每张工作表都有不同的gid,当您重新订购或重新命名工作表时它们不会更改(滚动到每张工作表的URL末尾以查看我的意思)。
所有URL访问仅打开FIRST表。例如,
SpreadsheetApp.openById(SHEET_ID).getDataRange().getValues()
返回第一张表的值,即使我在末尾包含“gid”部分。与openById
和openFile
相同。
所以我的问题是,如何在重新命名工作表或重新排序电子表格中的工作表之后,以一种方式访问工作表?
答案 0 :(得分:2)
没有getSheetById
方法,但您可以使用getSheetId()构建自己的方法。这里:
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?
}
答案 1 :(得分:1)
是的,有一个工作表ID。它的sheet.getSheetId。这个id可以从应用程序脚本中使用,也可以转换为“真正的”gid来制作表单URL。做(sheetId ^ 31578).toString(36)来获取gid。 我不得不逆转它以获得它,我不能保证它会永远有效。