以编程方式创建Google表格并获取其JSON URL

时间:2019-06-14 17:54:32

标签: google-apps-script google-sheets

我有一个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已贬值,因此无法获取已发布的U​​RL。

所以我想我可以使用此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所需要的字母数字。

是否有获取特定工作表的已发布URL或JSON URL的信息?

修改

我忘了提到这是Enterprise G-Suite,并且公司域外的共享被阻止了。

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:0)

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

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

您需要做什么吗?