【发布时间】:2019-10-29 09:08:36
【问题描述】:
我有一个 Google Apps 脚本,可以将电子表格从一个团队驱动器复制到另一个团队驱动器,然后发布新的电子表格。我想获取特定工作表的已发布 URL 或获取工作表的 JSON URL。
这是我目前的工作代码:
var dFolderID = "destination folder ID";
var sFileID = "source spreadsheet ID";
// get the destination folder
var dFolder = DriveApp.getFolderById(dFolderID);
// get the source file
var sFile = DriveApp.getFileById(sFileID);
// name of the new file
var nFileName = "test - " + Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "yyyyMMddHHmmss");
// make a copy of the spreadsheet
var nFile = sFile.makeCopy(nFileName, dFolder);
// get the ID of the new spreadsheet
var nFileID = nFile.getId();
// publish it
var publishResponse = Drive.Revisions.update({
published: true,
publishedOutsideDomain: false,
publishAuto: true
}, nFileID, 1);
此时,新电子表格已创建,我知道电子表格的 ID/密钥,并且已发布。
据我所知,由于publishResponse.publishedLink 已被贬值,因此无法获取已发布的 URL。
然后我想我可以使用这个 URL 来获取工作表的 JSON:
https://spreadsheets.google.com/feeds/list/SPREADSHEET_ID/WORKSHEET_ID/public/values?alt=json
但要使其正常工作,我必须知道WORKSHEET_ID。我知道我可以使用像 1、2、3 等这样的工作表索引......但是如果工作表顺序发生变化,那将会中断。
据我所知,获取WORKSHEET_ID 的唯一方法是检查此 URL:
https://spreadsheets.google.com/feeds/worksheets/SPREADSHEET_ID/private/full
如果我在浏览器中加载此 URL,我会收到一个 XML 响应,并且可以在其中看到 WORKSHEET_ID。但是,如果我尝试从我的 Google Apps 脚本加载此 URL,它将不起作用。它看起来像是重定向到 Google 的登录页面。
var privateFullUrl = Utilities.formatString("http://spreadsheets.google.com/feeds/worksheets/%s/public/full", nFileID);
var privateFullData = UrlFetchApp.fetch(privateFullUrl, {
contentType : 'application/xml; charset=utf-8'
});
Logger.log(privateFullData.getContentText());
我还检查了SpreadsheetApp.openById(nFileID).getSheetByName("..").getSheetId() 和SpreadsheetApp.openById(nFileID).getSheetByName("..").getRange(1,1).getDataSourceUrl(),但它们都返回了一个数字表ID,而不是我需要https://spreadsheets.google.com/feeds/list/SPREADSHEET_ID/WORKSHEET_ID/public/values?alt=json 的字母数字表ID。
是否可以获取特定工作表的已发布 URL 或 JSON URL?
编辑
我忘了提到这是 Enterprise G-Suite,在公司域之外共享被阻止。
【问题讨论】:
-
你试过google-query-language吗?它提供了一个端点
/gviz/tq?tqx=out:json来获取json。另外,尝试将 urlfetchapp 中的授权标头发送到您的端点/private/full。不记名令牌可以通过ScriptApp.getAccessToken()获取。 -
我认为@TheMaster 的评论是正确的。如果电子表格发布到 Web,您可以通过
var res = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/###/gviz/tq?gid=0&tqx=out:json");检索 JSON 数据。gid=0是工作表 ID。 ```###`` 是文件 ID。如果电子表格未发布,请使用访问令牌。 -
谢谢@TheMaster。如果您将
ScriptApp.getAccessToken()作为答案,我会接受。
标签: google-apps-script google-sheets