尝试使用在Apps脚本中调用Drive SDK的文件创建新项目。
以下UrlFetchApp
请求中的确切位置......
{
"files": [
{
"id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
"name":"Code",
"type":"server_js",
"source":"function doGet() {\n return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
},
{
"id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
"name":"index",
"type":"html",
"source":"\u003chtml\u003e\n \u003cbody\u003e\n New message!!\n \u003c/body\u003e\n\u003c/html\u003e"
}
]
}
来自import/export docs和example video Dan的提及,这些调用是针对Apps脚本以外的语言,但请求脚本文件类型列表和这些文件的内容{{ 3}}一旦使用Eric的oAuth2库设置了授权。
我最近的猜测......
function createProject( ) {
var token = getDriveService().getAccessToken(); // from Eric's oAuth2 lib
var url = 'https://www.googleapis.com/upload/drive/v2/files?convert=true';
// Where does this go?
var files = {
"files": [
{
"name":"Code",
"type":"server_js",
"source":"function doGet() {\n return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
},
{
"name":"index",
"type":"html",
"source":"\u003chtml\u003e\n \u003cbody\u003e\n Hello, world!!\n \u003c/body\u003e\n\u003c/html\u003e"
}
]
};
// Where does this go too?
var metadata = {
'title': 'script-test1',
'mimeType': 'application/vnd.google-apps.script',
"parents": [
{
"id": "0B2VkNbQMTnaCODBRVjZQcXBXckU"
}
],
};
var options = {
'headers' : {
'Authorization': 'Bearer ' + token,
'Content-Type': 'application/vnd.google-apps.script+json',
},
'method' : 'POST',
'payload' : files // probably not right
};
var response = UrlFetchApp.fetch(url, options);
Logger.log(response.getResponseCode());
}
创建未知类型的无标题Drive文件,并将有效负载插入其中,但它未转换为脚本文件类型。
走另一条路,只是使用......
var file = {
"title": "Test script",
"mimeType": "application/vnd.google-apps.script",
"parents": [
{
"id": "[INSERT FOLDER ID HERE]"
}
]
};
Drive.Files.insert(file);
...引发内部错误。
还要注意具有客户端JS示例的does work,但不知道应将多少内容(如果可能)转换为服务器端的Apps脚本。
答案 0 :(得分:4)
你几乎就在那里,但你有一些错误。您的第一种方法(使用UrlFetch
)在options
变量中存在一些错误。这是一个doGet()函数,在(验证授权之后)创建一个新的Apps脚本项目并将UrlFetch响应写入页面:
function doGet() {
var driveService = getDriveService();
if (!driveService.hasAccess()) {
var authorizationUrl = driveService.getAuthorizationUrl();
var template = HtmlService.createTemplate(
'<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' +
'Refresh the page when authorization complete.');
template.authorizationUrl = authorizationUrl;
var page = template.evaluate();
return page;
} else {
var url = "https://www.googleapis.com/upload/drive/v2/files?convert=true";
var requestBody = {
"files": [
{
"name":"Code",
"type":"server_js",
"source":"function doGet() {\n return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
},
{
"name":"index",
"type":"html",
"source":"\u003chtml\u003e\n \u003cbody\u003e\n Created with Apps Script.\n \u003c/body\u003e\n\u003c/html\u003e"
}
]
};
var options = {
"headers": {
'Authorization': 'Bearer ' + driveService.getAccessToken(),
},
"contentType": "application/vnd.google-apps.script+json",
"method" : "post",
"payload": JSON.stringify(requestBody)
}
var response = UrlFetchApp.fetch(url, options);
return HtmlService.createHtmlOutput(response.getContentText());
}
}
此代码在根Drive文件夹中创建名为“Untitled”的Apps Script项目文件。 options
对象应指定POST作为创建项目的方法(默认为GET),并且需要将有效负载转换为JSON对象中的字符串,以便UrlFetch
理解。
或者,您可以使用Apps脚本中的高级云端硬盘服务而不是UrlFetch
来执行相同的操作。以下代码创建相同的Apps Script项目(但将其放在指定的文件夹中并将文件命名为'Test script'):
function createGoogleFileInFolder3() {
var requestBody = {
"files": [
{
"name":"Code",
"type":"server_js",
"source":"function doGet() {\n return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
},
{
"name":"index",
"type":"html",
"source":"\u003chtml\u003e\n \u003cbody\u003e\n Created with Apps Script.\n \u003c/body\u003e\n\u003c/html\u003e"
}
]
};
var resource = {
"title": "Test script",
"parents": [
{
"id": "<parent folder id here>"
}
]
};
var blob = Utilities.newBlob(JSON.stringify(requestBody), "application/vnd.google-apps.script+json");
Drive.Files.insert(resource, blob, {"convert":"true"});
}