使用Google Advanced Drive服务在Apps脚本文件夹中创建新文件

Ala*_*lls 12 google-apps-script google-drive-api

有四种方法可以创建新文件:

  • DocsList - 在主列表中显示为DocsList.内置于Apps脚本.
  • DriveApp - 在主列表中显示为驱动器.内置于Apps脚本.
  • Drive API - 在主列表中也显示为Drive. 必须添加到Apps脚本.
  • DocumentApp - 在主列表中显示为文档.内置,但只创建一个文档文件.

它们都被称为服务.Drive API称为高级服务.那么,你应该使用哪一个?我不知道,这取决于.此问题与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);
Run Code Online (Sandbox Code Playgroud)

即使代码有效,我也不知道为什么语法是这样的,我找不到告诉我原因的文档.我可以找到一个属性列表:

title:mimeType:可选属性的部分Request Body.从示例中,可选属性显然放在一个键:值配对对象中.那么,语法是:

Drive.Files.insert(optional properties, content);
Run Code Online (Sandbox Code Playgroud)

还有必需的查询参数:

uploadType- > media,multipart,resumable

但是我没有uploadType在示例代码中看到任何指定的必需参数.所以,我不了解Google的文档.

Google文档插入

是否可以在Apps Script .gs代码文件中使用Google Advanced Drive服务直接写入特定驱动器?我该怎么做?

Luc*_* Wa 11

创建新文件的最简单方法是使用DriveApp纯Google Apps脚本附带的文件:

var dir = DriveApp.getFolderById("{dir_id}");
var file = dir.createFile(name, content);
Run Code Online (Sandbox Code Playgroud)

如果您不知道确切目录的ID,则可以通过其名称获取该文件夹:

var dir = DriveApp.getFoldersByName(name).next();
Run Code Online (Sandbox Code Playgroud)

next()是有原因getFoldersByName()返回其名称匹配给定值的所有目录的集合.

另请查看DriveApp文档:https://developers.google.com/apps-script/reference/drive/drive-app

  • 我的理解是 DriveApp 不能用于将文件添加到共享驱动器。在这种情况下,您必须使用云端硬盘。 (2认同)

小智 10

也许这有点晚了,但通过查看REST API文档,它表明您可以使用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'
 };
Run Code Online (Sandbox Code Playgroud)

可以从共享的链接使用谷歌驱动GUI来获得文件夹ID或者如图这里.(例如,使用右侧的执行功能.)

或者,您可以通过替换folder.getID()使用来按名称访问该文件夹Drive.getFoldersByName('name of folder').

这很有用,因为Drive.Files.insert()接受参数的同时Drive.createFile()Drive.createFolder()不接受.


Ala*_*lls 5

对于文档INSERT驱动器API,在这个环节发现:

用于插入的驱动器 API

有一个部分用于请求正文Insert可选属性之一是parents[]。括号 [] 表示可以指定父项列表。父母 []的文档说明了这一点:

包含此文件的父文件夹的集合。设置此字段会将文件放入所有提供的文件夹中。插入时,如果未提供文件夹,则文件将放置在默认根文件夹中。

所以, 。. . 使用在Drive API 中插入,。. . . 可以将新文件直接写入子文件夹。这是可能的。

现在,Google Drive SDK的命名和语法,HTTP 请求与 Apps Script 中的不同。

在文件中调用 Drive API HTTP 请求的语法.gs是以下三种之一:

  • Drive.Files.insert(文件资源)
  • Drive.Files.insert(文件资源,BLOB mediaData)
  • Drive.Files.insert(文件资源,BLOB mediaData,OBJECT optionalArgs)

上面列表中显示的语法来自 Apps 脚本代码编辑器内的自动完成下拉列表。如果您键入Drive.Files.,将出现可能的方法列表。我在在线文档的任何地方都找不到有关语法的信息。

那么,parents[]可选属性去哪儿了?嗯,它不是一个 Blob,所以我们可以排除它。它是FILE resource, 或OBJECT optionalArgsoptionalArgs表示它是一个object,但FILE resource实际上也是一个object

在示例中,FILE resource被构造为键:值对对象。

上传文件 - 高级驱动服务 - Google 文档

  • 仅供参考,我们的文档中有一节描述了如何从 Google API 的参考文档映射到 Apps 脚本中的等效高级服务:https://developers.google.com/apps-script/guides/services/advanced#how_method_signatures_are_determined (3认同)