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

时间:2014-06-15 00:03:24

标签: google-apps-script google-drive-api

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

  • DocsList - 在主列表中显示为 DocsList 。内置于Apps脚本。
  • DriveApp - 在主列表中显示为云端硬盘。内置于Apps脚本。
  • Drive API - 在主列表中也显示为云端硬盘必须添加到Apps脚本。
  • DocumentApp - 在主列表中显示为文档。内置,但只创建文档文件。

它们都被称为服务。 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 - > mediamultipartresumable

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

Google Documentation Insert

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

6 个答案:

答案 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 文档位于以下链接:

Drive API for INSERT

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

  

包含此文件的父文件夹的集合。设置这个   字段将把文件放在所有提供的文件夹中。在插入时,如果   没有提供文件夹,该文件将被放置在默认根目录中   文件夹中。

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

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

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

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

上面列表中显示的语法来自Apps Script代码编辑器中的自动完成下拉列表。如果您键入Drive.Files.,则会显示可能的方法列表。我无法在在线文档中找到有关语法的信息。

那么, parent [] 可选属性在哪里?好吧,它不是Blob,所以我们可以排除它。它可以是FILE resourceOBJECT 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

本质上,DriveAppDrive更易于使用,但是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();

相关问题