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

How to insert file to a shared drive using REST on Apps Script?

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

这是我的代码:

var DriveScope = 'https://www.googleapis.com/auth/drive';
var ServiceAccountPrivateKey ="-----BEGIN PRIVATE KEY----"
var ServiceAccountEmail = "drive-uploads@xxxxxxx.com";

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': 'bob@example.com',
  '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 上。任何帮助将不胜感激。谢谢!

  • 你的问题需要分三步:

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

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

  • 更难的是1.2.的组合。

  • Files: create 方法为仅 media upload 请求或 metadata-only.

  • 提供 URI
  • 解决方法是执行 resumable Upload,这样您可以先 post 元数据,然后再添加文件内容。

  • 您需要使用的 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())  
}