如何在Apps脚本上使用REST将文件插入共享驱动器?

问题描述 投票:0回答:1

是否可以使用POST方法将文件上传到共享驱动器?我不知道如何调用共享驱动器的驱动器ID并将其定位到URL提取功能,这可能吗?

这是我的代码:

var DriveScope = 'https://www.googleapis.com/auth/drive';
var ServiceAccountPrivateKey ="-----BEGIN PRIVATE KEY----"
var ServiceAccountEmail = "[email protected]";

function testinRest(){
var service = getDriveService();

var driveID = "XXXXXXXX";
var APIKey = "XXXXXXXXXXXXX";

var resumeBlob = Utilities.newBlob('Hire me!', 'text/plain', 'resume.txt');
var formData = {
  'name': 'Bob Smith',
  'email': '[email protected]',
  'resume': resumeBlob
};

  var url = 'https://www.googleapis.com/drive/v3/drives';
  var output = UrlFetchApp.fetch(url, {
    method: 'get',
    headers: { 'Authorization': 'Bearer ' + service.getAccessToken() },
    contentType: 'application/json'
  }).getContentText();  

  var response= JSON.parse(output);

  for(var i=0; i < response.drives.length; i++){

    if(driveID == response.drives[i].id){
      service.reset()
      if (service.hasAccess()) {
        var newPresentationName = "RJ POGI";
        var url = 'https://www.googleapis.com/upload/drive/v3/files?supportsAllDrives=true&key=' + APIKey;
        var body = {
          "name": newPresentationName,
          "parents": [driveID]
        };
        var params = {
          headers: {
            Authorization: 'Bearer ' + service.getAccessToken(),
            Referer:'https://explorer.apis.google.com' 
          },

          method: 'post',
          payload: formData,//JSON.stringify(body),
          contentType: 'application/json',
          muteHttpExceptions: true
        };
        var response = UrlFetchApp.fetch(url, params).getContentText();
        Logger.log('response: ' + response);
        var id = JSON.parse(response).id;
        return id;
      }
    }

}

}

function getDriveService(){
  var service = OAuth2.createService('drive').setTokenUrl('https://accounts.google.com/o/oauth2/token').setPrivateKey(ServiceAccountPrivateKey).setClientId(ServiceAccountEmail).setPropertyStore(PropertiesService.getUserProperties()).setScope(DriveScope);
  //console.log("Service::" + service);
  //console.log('Service Has Access::' + service.hasAccess()); 
  if (!service.hasAccess()) {
    Logger.log('Authentication error: %s', service.getLastError());
    return;
  }else{
     return service;
  }

}

function reset() {
  var service = getDriveService();
  service.reset();
}

在此示例中,我希望将resumeBlob插入目标DriveID上。任何帮助将不胜感激。谢谢!

rest google-apps-script google-drive-api urlfetch
1个回答
0
投票
  • 您的问题需要分为三个步骤:

    1. 使用UrlFetchApp在驱动器上创建文件
    2. 将内容传递到文件
    3. 将文件插入共享驱动器

  • 现在,您原来的问题-3.很容易解决,您只需要在请求中指定supportsTeamDrives=true

  • 更困难的是1.2.的组合。

  • Files: create方法为仅media upload请求或metadata-only提供URI。

  • 解决方法是执行resumable Upload,该操作可让您先发布元数据,然后再添加文件内容。

  • 您需要使用的URI为"https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&uploadType=resumable"

示例:

function uploadToSharedDrive(){
  var url = "https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&uploadType=resumable"; 
  var resumeBlob = Utilities.newBlob('Hire me!');

  var formData = {
    'name': 'Bob Smith',
    'mimeType': 'text/plain',
    'parents': [
      "ID of the shared drive"
    ]
  };
  params = {
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()   
    },
    contentType:  'application/json',    
    method: 'post',
    payload: JSON.stringify(formData),
  }
  var response = UrlFetchApp.fetch(url, params);
  Logger.log(response.getContentText()); 
  data = resumeBlob.getBytes();
  var params2 = {
    method: "put",
    payload: data,
    muteHttpExceptions: true,
  };
  var location = response.getHeaders().Location;
  var response = UrlFetchApp.fetch(location, params2);
  Logger.log(response.getContentText())  
}
© www.soinside.com 2019 - 2024. All rights reserved.