【问题标题】:How to programmatically (via AppsScript) open a specific Sheet in a Google Spreadsheet via URL如何以编程方式(通过 AppsScript)通过 URL 在 Google 电子表格中打开特定工作表
【发布时间】:2021-11-12 21:54:07
【问题描述】:

我有一个包含 URL 的源工作表。这些 URL 指向其他电子表格中的特定目标工作表(选项卡)。 (如果我手动单击链接,它们会打开正确的选项卡/工作表。)

网址如下所示: https://docs.google.com/spreadsheets/d/<spreadsheetID>/edit?resourcekey=<ignored>#gid=<sheetid>。 (“gid=NNN”部分标识要激活的电子表格中的工作表(选项卡)。)

我可以使用const sprd = SpreadsheetApp.openByUrl(url) 以编程方式打开目标电子表格。但是要获得特定的工作表(选项卡),我能找到的唯一有用的 API 是getActiveSheet(),但这被记录为返回工作表“显示在 UI 中”。但是这个电子表格没有显示在 UI 中。而 AFAICT,对于编程访问,“活动”工作表始终只是电子表格中的第一个工作表,与传递给 openByUrl() 的 URL 中的“gid”无关。

作为一种解决方法,我可以从 URL 中解析出“#gid=NNNN”。然后 openByUrl() 电子表格,调用 getSheets() 并将从 URL 中提取的 gid 与每个工作表的 .getSheetId() 进行比较,直到找到为止。 AFAICT,电子表格上没有像 getSheetByID() API 这样的东西。

我还缺少其他方法吗?

【问题讨论】:

  • 为什么不getSheetByName()
  • 据我所知,我没有任何工作表名称。访问选项卡时,URL 会从浏览器中复制出来,因此它们采用表格定义的格式。我无法控制 URL 中的内容。 (除非 GID 也是“名称”,否则可能会简化解决方法。)
  • 如果您没有工作表名称,那么正如您所说,循环并获取 ids

标签: google-apps-script google-sheets-api


【解决方案1】:

此功能需要您将 url 粘贴到提示符中。它将通过 url 打开电子表格并获取当前工作表上的所有数据并将其显示在对话框中,最后它将显示工作表的名称。

function getData() {
  const ui = SpreadsheetApp.getUi();
  const r = ui.prompt('Url Dialog', 'Enter Url', ui.ButtonSet.OK_CANCEL);
  if (r.getSelectedButton() == ui.Button.OK) {
    const url = r.getResponseText()
    const ss = SpreadsheetApp.openByUrl(url);
    let id = url.slice(url.indexOf("=") + 1);
    let sh = ss.getSheets().filter(sh => sh.getSheetId() == id)[0];
    let vs = sh.getDataRange().getDisplayValues();
    let s = '<textarea cols="50" rows="12"> ';
    vs.forEach((r, i) => {
      if (i > 0) {
        s += ['\n'];
      }
      s += r.join(',');
    })
    s += `\nSheet Name: ${sh.getName()}</textarea>`
    ui.showModelessDialog(HtmlService.createHtmlOutput(s).setWidth(800), 'Title');
  }
}

网址对话框:

数据对话框:

向下滚动到底部以查看工作表名称。

【讨论】:

  • 如果我能更好地控制我正在使用的 URL 的格式,这将起作用。但我们只是在访问工作表时将这些 URL 从浏览器中复制出来,据我所知,没有可用的“名称”。
  • 感谢您构建一个工作示例!做得很好。希望看到一个真正的 API,但至少它可以推出我们自己的。如果您使用 url.match(/gid=([0-9]+)/)[1] 之类的内容,从 URL 中提取 gid 可能会更可靠
  • 我认为 = 符号是一个很好的分隔符
【解决方案2】:

出于文档目的发布此内容。

正如其他人所说,遍历工作表以找到具有正确 id 的工作表。

最合适的方式是使用find:

const sheetId = url.match(/gid=([0-9]+)/)[1];
const ss = SpreadsheetApp.openByUrl(url);
const sheet = ss.getSheets().find(sheet => sheet.getSheetId() == sheetId);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多