google-apps-script - Google 云端硬盘 API : Create Folder: Allow conflict error if folder by name exists

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

讨论
Google Drive API v3 :Create Folder
云驱动 API 比较
创建文件夹时的其他云盘API,包括 Box API Dropbox API ,如果父文件夹中已存在同名文件夹,则两者都会返回冲突错误。
然而, Google Drive API 默认情况下允许创建同名文件夹。
问题
如果尝试在 Google Drive 父文件夹中创建同名文件夹,是否有办法返回冲突错误?
如果我首先使用 API 来按名称搜索文件夹,然后在不存在的情况下创建文件夹,那么这可能导致并行进程在按名称创建唯一文件夹时执行相同的任务,从而导致可能的竞争条件。
示例
Google Drive API 创建文件夹调用 curl

curl "https://www.googleapis.com/drive/v3/files" \
--request POST \
--verbose \
--write-out 'HTTPSTATUS:%{http_code}' \
--silent \
--header "authorization: Bearer [** ACCESS TOKEN **]" \
--header "cache-control: no-cache" \
--header "content-type: application/json; charset=utf-8" \
--header "Accept: application/json" \
--data '{ \
    "mimeType":"application\/vnd.google-apps.folder", \
    "name": "[** FOLDER NAME **]", \
    "parents": ["root"] \
}'
每次调用都会在 Google Drive 父文件夹中创建一个新文件夹 唯一的文件夹 ID,但是,相同的文件夹名称 .我希望避免这种情况:
Success [HTTP status: 200]
{
  "kind": "drive#file",
  "id": "1mpy2-TVeZDTL8vZ6fKHTyoGoFHX-18EN",
  "name": "TEST",
  "mimeType": "application/vnd.google-apps.folder"
}
...
Success [HTTP status: 200]
{
  "kind": "drive#file",
  "id": "1iqYnEWOVFcWO3jWX1IgIv2wxtGVYruQX",
  "name": "TEST",
  "mimeType": "application/vnd.google-apps.folder"
}
我感谢任何帮助获得单一调用方法返回 冲突错误 自动重命名 .

最佳答案

  • 如果在特定文件夹中创建新文件夹时存在相同的文件夹名称,您想要返回冲突错误。
  • 您想在异步过程中使用它。
  • 在这种情况下,您不想创建重复的文件夹名称。
  • 您希望通过 Drive API 的一个 API 调用来实现这一点。

  • 如果我的理解是正确的,这个答案怎么样?请将此视为几种可能的答案之一。

    问题和解决方法:

    在 Google Drive,所有文件和文件夹都由唯一 ID 管理。这样就可以在一个文件夹中创建同名的文件和文件夹。当使用 Drive API 时,它使用的 ID 不是文件名和文件夹名。因此,为了使用 Drive API 实现您的目标,需要搜索文件夹名称。而且,为了防止与异步处理创建相同的文件夹名称,需要进行独占处理。不幸的是,通过这种方式,仅使用简单的 curl 命令无法实现您的目标。

    从上述情况来看,为了仅使用简单的 curl 命令实现您的目标,我想使用 Web Apps 作为 API 作为解决方法。 Web Apps 是由 Google Apps Script 创建的,它可以像 API 一样使用。由此,我认为您的目标可以通过这种解决方法实现。

    用法:

    要使用此解决方法,请执行以下流程。
  • 创建新的 Google Apps 脚本项目。
  • 访问 script.google.com .
    在这种情况下,将显示登录屏幕。所以请登录谷歌。这样,脚本编辑器就打开了。
  • 当您第一次访问 script.google.com 时,您将被重定向到一个介绍 Apps 脚本的页面。届时请点击开始编写脚本 进入脚本编辑器。
  • 在左上角输入 GAS 项目的文件名。
  • 复制并粘贴以下示例脚本。这用作服务器端的脚本。
    function doGet(e) {
      var lock = LockService.getScriptLock();
      if (lock.tryLock(10000)) {
        var parent, folder;
        if (e.parameter.parentId) {
          parent = DriveApp.getFolderById(e.parameter.parentId);
          folder = parent.getFoldersByName(e.parameter.folderName);
        } else {
          parent = DriveApp.getRootFolder();
          folder = DriveApp.getFoldersByName(e.parameter.folderName);
        }
        if (folder.hasNext()) {
          lock.releaseLock();
          var err = {error: "Same folder name is existing."};
          return ContentService.createTextOutput(JSON.stringify(err)).setMimeType(ContentService.MimeType.JSON);
        }
        var folderId = parent.createFolder(e.parameter.folderName).getId();
        lock.releaseLock();
        var msg = {message: "Done.", folderId: folderId};
        return ContentService.createTextOutput(JSON.stringify(msg)).setMimeType(ContentService.MimeType.JSON);
      }
    }
    
  • 不幸的是,Web Apps 无法管理响应代码。在这种情况下,即使脚本中发生错误,也会返回 200 的状态代码。所以我将响应值作为 JSON 对象返回。
  • 在此脚本中,进程以独占处理运行。这样,即使您使用异步进程运行请求,也不会创建相同的文件夹名称。
  • 部署 Web 应用程序。
  • 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
  • 选择 “我” “执行应用程序为:” .
  • 选择 “只有我自己” “谁有权访问该应用程序:” .
  • 在这种情况下,为了访问 Web Apps,需要使用访问 token 。
  • 如果使用“任何人,甚至匿名”而不是“仅我自己”,则不需要使用访问 token 。
  • 单击“部署”按钮作为新的“项目版本”。
  • 自动打开“需要授权”对话框。
  • 单击“查看权限”。
  • 选择自己的帐户。
  • 在“此应用程序未经验证”处单击“高级”。
  • 点击“转到###项目名称###(不安全)”
  • 单击“允许”按钮。
  • 单击“确定”。
  • 复制 Web 应用程序的 URL。就像 https://script.google.com/macros/s/###/exec .
  • 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反射(reflect)到 Web Apps 中。请注意这一点。
  • 我认为开发者模式也可以使用,因为使用了访问 token 。但是在你的情况下,我认为服务器端的脚本可能适合它作为版本管理。所以我不建议使用开发者模式。
  • 使用带有以下 curl 命令的 deoloyed Web Apps。
    curl -L \
      -H "Authorization: Bearer ###" \
      "https://script.google.com/macros/s/###/exec?parentId=###&folderName=###"
    
  • parentIdfolderName用作查询参数。
  • folderName文件夹名称相同时存在于parentId的文件夹中, {"error":"Same folder name is existing."}被退回。
  • folderName文件夹名称相同时不存在于 parentId 的文件夹中,创建新文件夹并{"message":"Done.","folderId":"### folder ID of created folder ###"}被退回。

  • 引用:
  • Overview of Google Apps Script
  • Web Apps
  • Taking advantage of Web Apps with Google Apps Script
  • Class DriveApp
  • Lock Service

  • 如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    关于google-apps-script - Google 云端硬盘 API : Create Folder: Allow conflict error if folder by name exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59184790/

    相关文章:

    google-apps-script - 使用 PostMan 测试 Google 脚本

    java - 如何解决imageadpter错误?

    php - 试图让 php 将文件路径识别为域

    java - 使用 API 和错误 403 将文件上传到 Google 驱动器

    javascript - Google 文档脚本 addToFolder

    google-drive-api - Google OAuth 接受按钮已禁用

    google-apps-script - 更改数据透视表数据范围的 JavaScript 方法 Google Docs 电子表格

    javascript - 应用脚本 : creating 'dynamic' pages in web apps?

    authentication - Google Apps 脚本授权错误

    java - 获取正在运行的java文件的当前路径