有四种方法可以创建新文件:
它们都被称为服务。 Drive API称为高级服务。那么,你应该使用哪一个?我不知道,这取决于。此问题与云端硬盘高级服务有关。
我不想使用2或3项服务来完成工作。我想用其中一个。但是要决定使用哪一个,我需要知道所有这些的功能和选项。如果最简单和最容易使用的将完成我想要的任何事情,那么我将使用它。
如果我可以使用Drive API创建新文件,但我需要使用DriveApp服务将我使用Drive API创建的文件移动到我想要的文件夹,那么在特定情况下使用Drive API是没有意义的。
我可以通过Google Apps脚本.gs
代码在我的Google云端硬盘中创建一个新文件,但该文件会写入主“我的云端硬盘”。我想将文件直接写入子文件夹。我目前的代码是:
var fileNameSetA = 'someFile.jpg';
var uploadedBlobA = an image uploaded with a file picker;
var fileTestDrive = {
title: fileNameSetA,
mimeType: 'image/jpeg'
};
fileTestDrive = Drive.Files.insert(fileTestDrive, uploadedBlobA);
即使代码有效,我也不知道为什么语法是这样的,我找不到告诉我原因的文档。我可以找到一个属性列表:
title:
和mimeType:
是可选属性,是Request Body
的一部分。从示例中,可选属性显然放在一个键:值配对对象中。那么,是语法:
Drive.Files.insert(optional properties, content);
还有必需的查询参数:
uploadType
- > media
,multipart
,resumable
但是我没有在示例代码中的任何地方看到任何必需的uploadType
参数。所以,我不了解Google的文档。
是否可以在Apps Script .gs代码文件中使用Google Advanced Drive服务直接写入特定驱动器?我该怎么做?
答案 0 :(得分:10)
也许这有点晚了,但通过查看REST API docs,它表明您可以使用Drive.Files.insert插入任何文件夹。您只需在要插入的文件的属性中添加文件夹的ID:
var file = {
title: 'myFile',
"parents": [{'id':folder.getId()}], //<--By setting this parent ID to the folder's ID, it creates this file in the correct folder.
mimeType: 'image/png'
};
可以使用Google云端硬盘GUI从可共享链接获取文件夹ID,如图所示here。 (例如,使用右侧的执行功能。)
或者,您可以通过将folder.getID()
替换为Drive.getFoldersByName('name of folder')
来按名称访问该文件夹。
这很有用,因为Drive.Files.insert()
接受参数而Drive.createFile()
和Drive.createFolder()
不接受。
答案 1 :(得分:8)
创建新文件的最简单方法是使用纯Google Apps脚本附带的DriveApp
:
var dir = DriveApp.getFolderById("{dir_id}");
var file = dir.createFile(name, content);
如果您不知道确切目录的ID,可以按名称获取该文件夹:
var dir = DriveApp.getFoldersByName(name).next();
next()
因为getFoldersByName()
返回名称与给定值匹配的所有目录的集合。
同时检查DriveApp
文档:https://developers.google.com/apps-script/reference/drive/drive-app
答案 2 :(得分:3)
Drive API 的 INSERT 文档位于以下链接:
请求正文有一个部分。 插入的可选属性之一是 parents [] 。括号[]表示可以指定父母列表。 parents [] 的文档说明了这一点:
包含此文件的父文件夹的集合。设置这个 字段将把文件放在所有提供的文件夹中。在插入时,如果 没有提供文件夹,该文件将被放置在默认根目录中 文件夹中。
所以,。 。 。在 Drive API 中使用插入 ,. 。 。 。 CAN 将新文件直接写入子文件夹。这是可能的。
现在, Google Drive SDK , HTTP请求的命名和语法与Apps脚本内的不同。
在.gs
文件中调用Drive API HTTP请求的语法是以下三种之一:
上面列表中显示的语法来自Apps Script代码编辑器中的自动完成下拉列表。如果您键入Drive.Files.
,则会显示可能的方法列表。我无法在在线文档中找到有关语法的信息。
那么, parent [] 可选属性在哪里?好吧,它不是Blob,所以我们可以排除它。它可以是FILE resource
或OBJECT optionalArgs
。 optionalArgs 表示它是对象,但FILE resource
实际上也是对象。
在示例中,FILE resource
被构造为键:值对象。
Uploading Files - Advanced Drive Service - Google Documentation
答案 3 :(得分:0)
我能够使用DriveApp以这种方式在指定的文件夹中创建文件。
var driveFolder = DriveApp.getFolderByName("MyDriveFolder");
var file = driveFolder.createFile(formObject.txtReceipt);
file.setName("MyFile");
PS:formObject.txtReceipt来自html中表单上的文件上传控件,这会返回一个blob
答案 4 :(得分:0)
https://developers.google.com/apps-script/advanced/drive的摘要总结得很好:
高级云端硬盘服务可让您使用Google云端硬盘网络API 在Apps脚本中。与Apps Script的内置云端硬盘服务非常相似, API允许脚本在其中创建,查找和修改文件和文件夹 Google云端硬碟。在大多数情况下,内置服务更容易 使用,但是此高级服务提供了一些额外的功能, 包括访问自定义文件属性以及修订 文件和文件夹。
就像Apps脚本中的所有高级服务一样,高级驱动器 服务使用与公共相同的对象,方法和参数 API 。
本质上,DriveApp
比Drive
更易于使用,但是Drive
为您提供了更多功能,因为它与公共API共享相同的功能。我无法看到如何使用DriveApp
将文件保存到共享/团队驱动器,所以最终使用了Drive
。苦恼来自缺乏Drive
的Google Apps脚本实现文档。
将文件保存到Google驱动器的特定实现,但这对其他人可能很有用。我花了整整一天的时间才弄清楚这一点,因为严重缺乏Google Apps脚本的文档和代码示例。我的用例是将JSON文件保存到共享的Google云端硬盘(Team Drive)。
一开始我没有三个参数,文件也没有上传。我不确定是否所有必要。一个是"kind": "drive#parentReference"
元数据的parents
部分。下一个是"teamDriveId": teamDriveId
,它也位于元数据中。最后一个参数是"supportsAllDrives": true
,我在可选参数位置Drive.Files.insert()
中传递了该参数。
我发现https://developers.google.com/drive/api/v2/reference/files/insert上的API资源管理器在确定需要哪些参数以及如何格式化它们方面非常有用。我基本上在资源管理器中编辑了值,直到得到有效的网络请求。然后,我将我使用的参数提取到了Google Apps脚本中。
/**
* Creates a JSON file in the designated Google Drive location
* @param {String} jsonString - A JS string from the result of a JSON.stringify(jsObject)
* @param {String} filename - The filename. Be sure to include the .json extension
* @param {String} folderId - The ID of the Google Drive folder where the file will be created
* @param {String} teamDriveId - The ID of the team drive
* @return {void}
*/
function createJSONFileInDriveFolder(jsonString, filename, folderId, teamDriveId) {
var metadata = {
"title": filename,
"mimeType": "application/json",
"parents": [
{
"id": folderId,
"kind": "drive#parentReference"
}
],
"teamDriveId": teamDriveId
};
var optionalParams = {
"supportsAllDrives": true
};
try {
var jsonBlob = Utilities.newBlob(jsonString, 'application/vnd.google-apps.script+json');
Drive.Files.insert(metadata, jsonBlob, optionalParams);
} catch (error) {
Logger.log(error);
}
}
答案 5 :(得分:0)
var searchthreads = GmailApp.search('in:inbox AND after:2020/11/30 AND has:attachment');//"in:all -in:trash category:social older_than:15d
Logger.log("GMAIL thread 0:"+ searchthreads[0].getId());
Logger.log("GMAIL thread 1:"+ searchthreads[1].getId());
Logger.log("GMAIL thread 2:"+ searchthreads[2].getId());
Logger.log("Active User: " + me);
Logger.log("Search Thread: " + searchthreads.length);
Logger.log("Gmail lenght" + gmailthread.length);
//Logger.log("Gmail lenght" + gmailMessages.length);
for (var i in searchthreads){
var messageCOunt = searchthreads[i].getMessageCount();
Logger.log("messageCOunt :" + messageCOunt);
var messages = searchthreads[i].getMessages();
for (var m in messages){
var messagesender = messages[m].getFrom();
var messageDate = messages[m].getDate();
var messageReplyTo = messages[m].getReplyTo();
var messagesubject = messages[m].getSubject();
var messagebody = messages[m].getSubject();
var messagephoneNo = messages[m].getSubject();
//messages[m].isInInbox();
var messageid = messages[m].getId();
var messageplainbody = messages[m].getSubject();//messages[0].getPlainBody();
var EmailStatus ='N';
var ApptStatus = "CVReceived";// Tracking till candidate offer and payout
var messageattachement = messages[m].getAttachments();
//var png=UrlFetchApp.fetch(messageattachement).getBlob();
//https://drive.google.com/drive/folders/1RY4i6FwUvfy5OxrJ1pZTxJAOxjFFXbhz?usp=sharing
var folder = DriveApp.getFolderById("1RY4i6FwUvfy5OxrJ1pZTxJAOxjFFXbhz");
// DriveApp.getFolderById("1RY4i6FwUvfy5OxrJ1pZTxJAOxjFFXbhz").createFile(png);
//DriveApp.createFile();
for (var k in messageattachement){
var filename = messageattachement[k].getName();
var filesize = messageattachement[k].getSize();
var filecontent = messageattachement[k].getContentType();
var fileBlob = messageattachement[k].getAs(filecontent);
var filecpblob = messageattachement[k].copyBlob();
//folder.createFile(filename, messageattachement);
var file = {
title: filename,
"parents": [{'id':folder.getId()}],
mimeType: filecontent
};
file = Drive.Files.insert(file, filecpblob);
//DataStudioApp
Logger.log('ID: %s, File size (bytes): %s', file.id, file.fileSize);
//folder.createFile(filecpblob);
}
var processeddate = new Date();