【问题标题】:How to create a shortcut in Google Drive Apps Script instead of multiple parents如何在 Google Drive Apps 脚本中创建快捷方式而不是多个父级
【发布时间】:2020-05-27 16:01:17
【问题描述】:

我一直在尝试在这里阅读:https://developers.google.com/drive/api/v3/shortcuts

而且我了解快捷方式的基础知识,但我不知道如何在代码中使用它——语法。

我不需要将文件夹放置在多个文件夹中,而是将快捷方式放置在与原始文件夹命名相同的文件夹中。

我在 Drafts 中有一个名为 Project1 的原始文件夹。此文件夹的快捷方式需要放在 Folder2/Drafts、Folder3/Drafts 和 Folder4/Drafts 中。

如果我之后更改原始文件夹 Project1 的名称,例如。到“新建筑”我需要在文件夹 2,3 和 4 中找到快捷方式(按 ID?-我可以将快捷方式的 ID 放在数据表中,从中可以遍历它们)-然后将它们重命名为原始文件夹的新名称。

当我将 Project1 从草稿移至已确认时。我需要将快捷方式从 Folder2/Drafts 移动到 Folder2/Confirmed 等。

这主要是放置新文件夹的基本代码的样子

        var folder1 = draft.createFolder("DRAFT - "+"Project1");
        var folder1Url = folder1.getUrl();
        var folder1Id = folder1.getId();
        folder2Draft.addFolder(folder1);

当更改文件夹的名称时,该名称(当然)会在其他地方发生变化。但据我了解,快捷方式并非如此。我已经使用手动创建的快捷方式对其进行了测试,证实了这一点。

我在确认项目时重命名的部分是这样的:

   var folder1 = DriveApp.getFolderById(folder1Id);
   var folder1NameOld = folder1.getName();
   var folder1NameNew = folder1NameOld.replace("DRAFT - ","");
   folder1.setName(folder1NameNew);

我在用简单的方式确认项目时移动文件:

    confirmed.addFolder(folder1);
    draftsFolder.removeFolder(folder1);

脚本是在电子表格中制​​作的,我已经将所有文件夹 ID 放在文件的数据表中,因此我可以非常轻松地引用不同的文件夹,如果需要,还可以收集快捷方式的 ID 以便能够重命名他们。

更新: 提出一个更清楚的问题: 如何使用快捷方式而不是多育儿来做到这一点?

function shortcut() {

  var s = SpreadsheetApp.getActive();
  var sheet = s.getActiveSheet();
  var projectFolderId = sheet.getRange('B1').getValue();
  var folder1DraftId = sheet.getRange('B2').getValue();
  var folder2DraftId = sheet.getRange('B3').getValue();

  var folder1 = DriveApp.getFolderById(projectFolderId);
  DriveApp.getFolderById(folder1DraftId).addFolder(folder1);
  DriveApp.getFolderById(folder2DraftId).addFolder(folder1);
}

【问题讨论】:

  • this 回答你的问题了吗?
  • @Cooper 感谢您的回复。也许它确实回答了我的问题。但是后来我无法理解它;-) 我已经用一个简单而明确的问题(我希望)更新了我的帖子,以将其分解到最低限度。从那里我想我将能够完成剩下的工作。

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


【解决方案1】:

我相信你的目标如下。

  • 你想实现以下脚本作为快捷方式。

    function shortcut() {
    
      var s = SpreadsheetApp.getActive();
      var sheet = s.getActiveSheet();
      var projectFolderId = sheet.getRange('B1').getValue();
      var folder1DraftId = sheet.getRange('B2').getValue();
      var folder2DraftId = sheet.getRange('B3').getValue();
    
      var folder1 = DriveApp.getFolderById(projectFolderId);
      DriveApp.getFolderById(folder1DraftId).addFolder(folder1);
      DriveApp.getFolderById(folder2DraftId).addFolder(folder1);
    }
    
  • 在上面的脚本中,folder1被放在folder1DraftIdfolder2DraftId的文件夹中。

对于这个,这个答案怎么样?

修改点:

  • 在这种情况下,使用 Drive API 中的 files.create 方法。但在现阶段,Drive API v2中的Files:insert方法也可以创建快捷方式。所以在这个答案中,使用了 Advanced Google services 的 Drive API v2。

修改脚本:

当你的脚本被修改后,它变成如下。在运行脚本之前,please enable Drive API at Advanced Google services

从:
var folder1 = DriveApp.getFolderById(projectFolderId);
DriveApp.getFolderById(folder1DraftId).addFolder(folder1);
DriveApp.getFolderById(folder2DraftId).addFolder(folder1);
到:
const folderIDs = [folder1DraftId, folder2DraftId];
folderIDs.forEach(f => {
  Drive.Files.insert({
    shortcutDetails: {targetId: projectFolderId},
    parents: [{id: f}],
    title: DriveApp.getFolderById(projectFolderId).getName(),
    mimeType: "application/vnd.google-apps.shortcut"
  });
});

参考资料:

  • Advanced Google services
  • Create a shortcut to a Drive file
  • Files: insert of Drive API v2

    • 官方文档是这样说的。

      • 注意:使用 files.insert 创建快捷方式的应用必须指定 MIME 类型 application/vnd.google-apps.drive-sdk

      • 但是,当使用application/vnd.google-apps.drive-sdk 时,无法创建快捷方式。我不确定这是错误还是当前规范。所以我用application/vnd.google-apps.shortcut作为mimeType。

【讨论】:

  • 正是我需要进行的。谢谢!
  • @Kasper Egelund 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
  • 在现阶段,您的目标可以使用Drive服务(DriveApp)实现如下。 const folderIDs = [folder1DraftId, folder2DraftId]; folderIDs.forEach(f => DriveApp.createShortcut(projectFolderId).moveTo(DriveApp.getFolderById(f)));Ref
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2015-05-17
  • 2019-09-29
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多