如何以编程方式(通过 AppsScript)通过 URL 在 Google 电子表格中打开特定的 Sheet

How to programmatically (via AppsScript) open a specific Sheet in a Google Spreadsheet via URL

我有一个来源 Sheet,里面有 URLs。那些 URLs 指向其他 Spread[=36= 中的特定目标 Sheets(标签) ]s。 (如果我手动单击链接,它们会打开正确的 Tab/Sheet。)

URL 看起来像这样: https://docs.google.com/spreadsheets/d/<spreadsheetID>/edit?resourcekey=<ignored>#gid=<sheetid>。 (“gid=NNN”部分标识要激活的 Spreadsheet 中的 Sheet(制表符)。)

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

作为解决方法,我可以从 URL 中解析出“#gid=NNNN”。然后 openByUrl() Spreadsheet,调用 getSheets() 并将从 URL 中提取的 gid 与每个 sheet 的 .getSheetId() 进行比较,直到找到它. AFAICT,没有什么比 Spreadsheet.

上的 getSheetByID() API

还有我遗漏的其他方法吗?

此功能要求您将 url 粘贴到提示中。它将打开 url 的传播 sheet 并获取当前 sheet 上的所有数据并将其显示在对话框中,最后它将显示 [=25] 的名称=].

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对话:

数据对话框:

向下滚动到底部以查看 sheet 名称。

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

正如其他人所说,循环遍历 sheet 以找到具有正确 id 的 sheet。

最合适的方法是使用 find:

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