首页 文章

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

提问于
浏览
6

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

我'm trying to use Google spreadsheets'脚本可以访问不同的电子表格 . 我唯一的信息是电子表格的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());

提前致谢!

4 回答

  • 0

    我会做这样简单的事情:

    var refSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET NAME HERE");
    var refSheetId = refSheet.getSheetId().toString();
    

    然后将refSheetId附加到getUrl字符串的末尾

    var ssUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl()+"#gid="+refSheetId;
    

    希望这可以帮助!

  • 0

    我知道这已经晚了,可能对原始请求者没用了 . 但是我在研究功能时看到了这个问题,但最后我自己解决了这个问题 . 您可以通过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
    
  • 1

    我就是这样做的:

    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");
    
  • 5

    出于多种原因,最好不要依赖gid

    • 已删除的工作表将不会显示在您的getSheets()方法中,但会在gid中占用,例如:

    创建Sheet1(默认情况下,gid#1)

    创建Sheet2(gid#2)

    删除Sheet2

    创建Sheet3(gid#3)

    • 如果用户决定在电子表格UI中移动工作表,则订单将混乱 . getSheets按照它们在电子表格中排列的顺序返回工作表 .

    你可以到达工作表的唯一方法是它的名字 . 或者,如果您知道工作表中的某些内容,则可以搜索每个工作表 .

相关问题