2

这是我第一次提交问题,所以如果我能更好地问这个问题,请帮助我。

我想要:

  • 创建文件夹
  • 在谷歌团队驱动器中
  • 嵌套在现有的团队云端硬盘文件夹“路径”中</li>
  • 来自 Google Apps 脚本,可以在脚本文件中或附加到 Google 表格

我相信这些资源会告诉我如何创建 Team Drive 文件夹:

方案 A:使用 GAS 创建一个文件夹。经过一番研究,据我了解,普通 GAS 尚无法在 Team Drive 中创建文件夹。

[18-03-15 14:55:23:674 EDT] 执行失败:无法在团队驱动器项目上使用此操作。(第 139 行,文件“utils”)[1.618 秒总运行时间]

//The folder with the current name doesn't exist - create it in the parent folder
var newFolder = DriveApp.createFolder(nextFolderName);
currFolder.addFolder(newFolder);

如果我错了,并且有一种简单的方法可以使 addFolder() 代码与 Team Drive 一起使用,那将是一场胜利。

更新 1:可以使用普通 GAS 在团队云端硬盘中创建一个文件夹。限制移动的是文件夹。这有效:

//The folder with the current name doesn't exist - create it in the parent folder
var newFolder = currFolder.createFolder(nextFolderName);

所以计划 B:现在,我正在尝试使用 Google Drive REST API v3 创建文件夹。但是,即使 TEAM_ROOT_PATH_FOLDER_ID 在团队驱动器中,当我运行我的代码时,我只会在我的个人驱动器中获得一个无标题文件。我认为我的问题是向 UrlFetchApp.fetch 获取正确的信息。就像没有读取请求正文一样。

参考:

这是我使用 Google Apps 脚本和 Drive REST API 创建文件夹的代码:

var TEAM_ROOT_PATH_FOLDER_ID = "diPcXqabvgpX4tcZJZ-ms2Wg0bXf1Fem"; //TODO fill in based on parent folder

function test() {
  createTeamDriveFolder(TEAM_ROOT_PATH_FOLDER_ID);
}


function createTeamDriveFolder(parentFolderId) {

  //BUILD THE URL
  var baseUrl = "https://www.googleapis.com/upload/drive/v3/files/";

  var urlParams = { //TODO correct for this function (after you figure this out)
    supportTeamDrives: true
    //,alt: "json"
    ,uploadType: "media"
  };

  //CODE CREDIT: https://ctrlq.org/code/20514-list-team-drives-google-drive-apps-script
  var queryString = Object.keys(urlParams).map(function(p) {
    return [encodeURIComponent(p), encodeURIComponent(urlParams[p])].join("=");
  }).join("&");

  var apiUrlStr = baseUrl + "?" + queryString;


  //BUILD THE REQUEST - HEADERS AND BODY
  var token = ScriptApp.getOAuthToken();
  var requestBody = {
    mimeType: "application/vnd.google-apps.folder"
    ,name: "TeamDriveTestFolder"
    ,"parents": [parentFolderId]
  };

  var requestBodyStr = JSON.stringify(requestBody);
  Logger.log("requestBody: " + requestBodyStr);

  var requestParams = {
    method: "POST"
    ,contentType: "application/json"
    ,contentLength: requestBodyStr.length
    ,headers: {"Authorization": "Bearer " + token}
    ,payload: requestBodyStr
  };

  var response = UrlFetchApp.fetch(apiUrlStr, requestParams);

  Logger.log(response.getResponseCode());
  Logger.log(response.getContentText());
}

但是,当我通过 API 测试运行 REST 调用时,我可以让一个文件夹出现在我的个人驱动器中(仍然错误):

支持团队驱动器 > 真

WORKS(在个人驱动器根目录中创建的 TeamDriveTestFolder 文件夹):

{
  "mimeType": "application/vnd.google-apps.folder",
  "name": "TeamDriveTestFolder"
}

失败(404):

{
  "mimeType": "application/vnd.google-apps.folder",
  "name": "TeamDriveTestFolder",
  "parents": ["diPcXqabvgpX4tcZJZ-ms2Wg0bXf1Fem"]
}

感谢您在破解此 Team 文件夹创建方面的任何帮助。

4

3 回答 3

4

对于您的第三点“嵌套在现有团队驱动器文件夹中”,您可以直接使用 GAS。以下是代码片段,

var parentFolder=DriveApp.getFolderById('folderId');
var newFolder=parentFolder.createFolder('name'); //replace name with Folder name.

在这里,您需要在 folderId 字段中传递父文件夹 ID。您可以在 Team Drive 的 URL 中找到此 FolderID。在下图中,“0AFmY7fi4434bUk9PVA”是文件夹 ID。 在此处输入图像描述

于 2018-03-28T08:38:04.770 回答
2

使用Drive高级服务 (V2 API 参考),创建文件夹相当简单,即使在团队云端硬盘中:

function getNewRootLevelFolderInTeamDrive(newTitle) {
  if(!newTitle) throw new TypeError("Missing argument for new folder's title");

  // Assumes you are working in the first Team Drive.
  var td = Drive.Teamdrives.list().items[0];
  var params = {
    supportsTeamDrives: true,
    includeTeamDriveItems: true,
  };
  // Making the folder uses Drive.Files.insert(). To create a folder, use the folder
  // MimeType, and ensure the resource is otherwise appropriately specified. You can
  // pass content, but it will be discarded, so just use `null` for the mediaBody / Blob.
  var metadata = {
    parents: [td],
    mimeType: MimeType.FOLDER,
    title: newTitle,
  };
  return Drive.Files.insert(metadata, null, params);
}

虽然上述方法会创建(并返回)一个文件夹,但它会强制该文件夹成为第一个团队云端硬盘中的根级文件夹。这是一个非常脆弱的“力量”,因为我们可以将新文件夹概括为任何给定文件夹的子文件夹:

function makeSubFolder(parentId, title) {
  if(!parentId) throw new TypeError("Expected a string ID to be passed, identifying the parent folder in which a folder will be created.");
  if(!title) title = "Random Folder Title";

  var params = {
    supportsTeamDrives: true,
    includeTeamDriveItems: true,
    corpora: /* Review the Drive API documentation on corpora and choose the applicable option. */
  };
  var metadata = {
    parents:[],
    mimeType: MimeType.FOLDER,
    title: title,
  };
  // Get the parent folder. Because we explicitly allow team drive items, and
  // declare support for team drives, team drive folders can be used.
  var folder = Drive.Files.get(parentId, params);
  if(folder.mimeType !== MimeType.FOLDER)
    throw new TypeError("Input parent folder ID is a file of type='" + file.mimeType + "'. Folders must be type='" + MimeType.FOLDER + "'.");

  // Make the new folder in the parent folder.
  metadata.parents.push(folder);
  return Drive.Files.insert(metadata, null, params);
}

使用它们的示例函数:

function foo() {
  var rootTDFolder = getNewRootLevelFolderInTeamDrive("stack_overflown");
  var folder = makeSubFolder(rootTDFolder.id, "a subfolder of 'stack_overflown'");
  console.log(rootTDFolder);
  console.log(folder);
}
于 2018-03-27T23:43:37.033 回答
1

MakeSubfolder 是一个了不起的解决方案。考虑将其更改为新 rootFolders 的全球替代品。

如果没有指示 parentFolder,只需在 Root 上创建即可。

与 Drive 和 SharedDrive 配合得很好也很神奇。

tnks 很多。

于 2021-08-25T08:18:59.943 回答