如何以编程方式(通过 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);
我有一个来源 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);