我正在尝试使用Google电子表格的脚本来访问其他电子表格。 我所拥有的唯一信息是电子表格的URL,其中包含密钥和gid(多表spreeadsheets的某种时间顺序索引 - 只有我能找到的信息是here)。
表格网址类似于https://docs.google.com/spreadsheet/ccc?key=abc123#gid=178 它链接到的工作表是电子表格中的第一张工作表。
如何找到匹配gid的工作表?
以下不起作用,因为它基于工作表的顺序,而不是它们的创建时间:
var ss = SpreadsheetApp.openById("abc123");
var sheet = ss.getSheets();
Browser.msgBox(sheets[178].getIndex());
提前致谢!
答案 0 :(得分:5)
我会做这样简单的事情:
var refSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET NAME HERE");
var refSheetId = refSheet.getSheetId().toString();
然后将refSheetId附加到getUrl字符串的末尾
var ssUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl()+"#gid="+refSheetId;
希望这有帮助!
答案 1 :(得分:1)
我知道这已经晚了,对原始请求者可能没用了。但是我在研究功能时看到了这个问题,但最后我自己解决了这个问题。您可以通过gid查找工作表,并且当您删除工作表时它不会改变这一事实是一件好事....如果您打算如何使用它。基本上我得到所有的工作表,并循环通过工作表名称和工作表gid直到gid匹配,然后我按名称调用工作表。
以下是我用来连续编辑的一部分代码的一部分,从编辑的聚合工作表开始,并作为双向同步的一部分推送到子工作表。如果您只存储了gid和密钥,则可以跳过我显示的步骤,并仅引用这些值。它似乎运行得非常快,它是一个更复杂的脚本,然后从工作簿中运行,但是两个脚本几乎只需要2秒就可以推送,这对我来说是可以接受的。
function Stest()
{
SpreadsheetApp.flush();
var sheet = SpreadsheetApp.getActiveSheet();
var r = sheet.getActiveRange();
var lastColumnRow = sheet.getLastColumn();
var activeRow = r.getRow();
var dataRange = sheet.getRange(activeRow,1,1,lastColumnRow);
var data = dataRange.getValues();
var sskeytemp = data[0][10].split("=")[1]; //the sheet url is in column k
var sskey = sskeytemp.split("#")[0]; //these first two steps get the sheet key
var ssid = data[0][10].split("gid=")[1]; //this last step gets the gid
var wrkbk = SpreadsheetApp.openById(sskey).getSheets(); //this gets the sheets from the workbook
for (var i = 0 ; i < wrkbk.length ; i++ ) {
if( ssid == wrkbk[i].getSheetId() ){ //this is to say if the spreadsheet gid, which is the gid of the sheet i know, matches the gid in the workbook from the link, thats the sheet i'm looking for
var ssname= wrkbk[i].getName();
var ss = SpreadsheetApp.openById(sskey).getSheetByName(ssname); //give me that sheet by name
var sslastColumn = ss.getLastColumn();
var sslastRow = ss.getLastRow();
var dataRange = ss.getRange(1,1,sslastRow,sslastColumn);
var data2 = dataRange.getValues(); //here's your data range, you can proceed freely from here
答案 2 :(得分:0)
出于多种原因,最好不要依赖gid
创建Sheet1(默认情况下,gid#1)
创建Sheet2(gid#2)
删除Sheet2
创建Sheet3(gid#3)
你可以到达工作表的唯一方法是它的名字。或者,如果您知道工作表中的某些内容,则可以搜索每个工作表。
答案 3 :(得分:0)
我就是这样做的:
function getSheetByGid(spreadsheet, gid){
gid = +gid || 0;
var res_ = undefined;
var sheets_ = spreadsheet.getSheets();
for(var i = sheets_.length; i--; ){
if(sheets_[i].getSheetId() === gid){
res_ = sheets_[i];
break;
}
}
return res_;
}
var sheet = SpreadsheetApp.openById("YOUR_SHEET_ID_HERE");
var seetWithGid = getSheetByGid(cpSheet, "YOUR_GID_HERE");
答案 4 :(得分:0)
或者这对我来说很完美:
function _getSheetId() {
var getSpreadsheetURL = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var mat = getSpreadsheetURL.match(/^(https:\/\/docs\.google\.com\/spreadsheets\/d\/)([a-zA-Z0-9]+\/)/g);
Logger.log(mat.toString()+"#gid="+SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId());
}