【问题标题】:Programatically create a Google Sheet and get it's JSON URL以编程方式创建 Google Sheet 并获取它的 JSON URL
【发布时间】: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


【解决方案1】:

要访问私人网址,您需要oauth 授权。您可以发送带有ScriptApp.getOAuthToken() 提供的不记名令牌的授权标头以绕过完整的oauth 流程。

UrlFetchApp.fetch(url, {headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}})

要从工作表中获取 JSON,也可以使用Google visualization api:

UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/gviz/tq?gid=0&tqx=out:json", 
{headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}});

或

UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/gviz/tq?gid=0&tqx=out:json&access_token="+ ScriptApp.getOAuthToken())

【讨论】:

    【解决方案2】:

    我不确定公共/私人会如何改变,但您可以打开任何 Google 文档,包括 ID 如下的电子表格:

    https://drive.google.com/open?id=XXXXX
    

    这能满足你的需要吗?

    【讨论】:

    • 这是在 Chrome 中打开工作表。我正在寻找 JSON URL,为此我需要发布 URL。但是@TheMaster 的评论帮助了我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多