10

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

我正在尝试使用 Google 电子表格的脚本来访问不同的电子表格。我拥有的唯一信息是电子表格的 URL,其中包含密钥和 gid(多页电子表格的某种按时间顺序排列的索引——我能找到的唯一信息在这里)。

工作表 URL 类似于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

5 回答 5

7

我会做这样简单的事情:

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

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

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

希望这可以帮助!

于 2013-02-19T20:04:21.080 回答
3

我就是这样做的:

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");
于 2018-06-06T07:35:27.103 回答
2

我知道这已经晚了,并且可能不再对原始请求者有用。但是我在处理功能时看到了这个问题,但后来我自己解决了。您可以通过 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
于 2012-10-30T19:35:56.817 回答
0

最好不要依赖gid,原因很多

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

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

创建 Sheet2 (gid#2)

删除 Sheet2

创建 Sheet3 (gid#3)

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

您可以访问工作表的唯一方法是通过其名称。或者,如果您知道工作表中的某些内容,则可以搜索每个工作表。

于 2012-09-13T04:39:13.377 回答
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());
}
于 2021-04-20T19:35:39.077 回答