【问题标题】:Get Google Sheet by ID?按 ID 获取 Google 表格?
【发布时间】:2014-12-28 05:19:40
【问题描述】:

我知道 Google Apps 脚本有一个用于工作表类的 getSheetId() method,但是有没有办法通过引用 ID 在电子表格中选择工作表?

我在Spreadsheet Class documentation 中没有看到类似 getSheetById() 的内容。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    你可以使用这样的东西:

    function getSheetById(id) {
      return SpreadsheetApp.getActive().getSheets().filter(
        function(s) {return s.getSheetId() === id;}
      )[0];
    }
    
    var sheet = getSheetById(123456789);
    

    然后要找到用于活动工作表的工作表 ID,运行它并检查日志或使用调试器。

    function getActiveSheetId(){
      var id  = SpreadsheetApp.getActiveSheet().getSheetId();
      Logger.log(id.toString());
      return id;
    }
    

    【讨论】:

    • 谢谢,我一直在这样做。可以做SpreadsheetApp.openById()也可以getSheetId()看起来很笨拙,但是不能按ID选择工作表。
    • 如果您已使用 Properties Service 保存了工作表 ID,请小心。当您调用 getProperty() 时,它可能与实际工作表 ID 不完全相同。确保将 Sheet.getSheetId().toString() 传递给 setProperty 方法,而不仅仅是 Sheet.getSheetId()。注意:您可能需要更改处理字符串的方法。
    • 您可以使用return sheets.find(sheet => sheet.getSheetId() === id) 创建一个衬里。前提是您创建了一个名为 sheet 的变量。
    • 当我使用 Serge insas 提出的 getSheetById() 函数或 melledijkstra 提出的 one-liner 时,我无法执行任何功能,例如.getRange() 在返回的工作表上。你能告诉我我必须做些什么才能使它成为可能吗?
    【解决方案2】:

    不确定 ID,但您可以通过工作表名称设置:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    ss.setActiveSheet(ss.getSheetByName("your_sheet_name"));
    

    SpreadsheetApp 类有一个setActiveSheet methodgetSheetByName method

    【讨论】:

      【解决方案3】:
      var sheetActive = SpreadsheetApp.openById("ID");
      var sheet = sheetActive.getSheetByName("Name");
      

      【讨论】:

      • 如果您知道工作表 ID 但不知道工作表名称,这对选择工作表有何帮助? SpreadsheetApp.openByID 打开的是电子表格,而不是工作表。
      • @browly 这很有帮助,因为 ID 永远不会改变,但是如果你明确地写下工作表名称并且工作表被重命名,脚本将不再起作用。
      • @Xzila SpreadsheetApp.openById() 打开的是电子表格,而不是工作表,因此它无助于回答所提出的实际问题。
      【解决方案4】:

      查看您的 URL 以获取查询参数 #gid

      https://docs.google.com/spreadsheets/d/1Vk7kzMD3DhfUeLasDdSK6Z9ScNrryPrawAxHGFimKp8/edit#gid=910184575

      在上面的例子中 gid=910184575,所以你可以这样做:

      function getSheetById_test(){
        var sheet = getSheetById(910184575);
        Logger.log(sheet.getName());
      }
      
      function getSheetById(gid){
        for each (var sheet in SpreadsheetApp.getActive().getSheets()) {
          if(sheet.getSheetId()==gid){
            return sheet;
          }
        }
      }
      

      【讨论】:

      • 由于未知原因,接受的答案对我不起作用。每个人的经典之作都能发挥作用!
      • @Rivo 也许试试我对第一个解决方案的评论?
      • @Rodolpho,请更新链接,因为它现在似乎无效。
      【解决方案5】:

      我很惊讶这个 API 不存在......这似乎是必不可少的。无论如何,这就是我在 GAS 实用程序库中使用的:

      /** 
        * Searches within a given Google Spreadsheet for a provided Sheet ID and returns
        * the Sheet if the sheet exists; otherwise it will return undefined if not found.
        *
        * @param {Spreadsheet} ss - a Google Spreadsheet object (https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet)
        * @param {Integer} sheetId - the ID of a Google Sheet 
        * @return {Sheet} the Google Sheet object if found; otherwise undefined (https://developers.google.com/apps-script/reference/spreadsheet/sheet)
        */
      function getSheetById(ss, sheetId) {
        var foundSheets = ss.getSheets().filter(sheet => sheet.getSheetId() === sheetId);
        return foundSheets.length ? foundSheets[0] : undefined;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        • 2022-12-18
        • 1970-01-01
        相关资源
        最近更新 更多