Google电子表格 - 使用gid访问工作表

时间:2012-09-12 20:34:21

标签: google-apps-script google-sheets

抱歉,如果我的问题在其他地方得到了解决,我整个下午一直在寻找谷歌的答案,但我还是太新手了。

我正在尝试使用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());

提前致谢!

5 个答案:

答案 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

  1. 删除的工作表不会显示在您的getSheets()方法中,但会在gid中占用 例如:
  2. 创建Sheet1(默认情况下,gid#1)

    创建Sheet2(gid#2)

    删除Sheet2

    创建Sheet3(gid#3)

    1. 如果用户决定在电子表格UI中移动工作表,则订单将混乱。 getSheets按照它们在电子表格中排列的顺序返回工作表。
    2. 你可以到达工作表的唯一方法是它的名字。或者,如果您知道工作表中的某些内容,则可以搜索每个工作表。

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