【问题标题】:Batch setting file permissions from gsheet script to drive (I can't set folder permissions)批量设置从 gsheet 脚本到驱动器的文件权限(我无法设置文件夹权限)
【发布时间】:2021-03-08 20:41:43
【问题描述】:

我正在尝试更改 1000 个文件的权限。我无法设置文件夹权限,因为我是“贡献者”而不是管理员或内容管理员。 (这会容易得多)

我已经编写了这段代码来逐个遍历每个文件并设置它的权限。

function grantaccesstoprivateids(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PictureIDs");
//var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();

// Skip the header row
for (var i = 2; i <= lastRow; i++) {
  Logger.log(sheet.getRange(i, 6));
  if (sheet.getRange(i, 6).getValue() == "PRIVATE") {
    var fileID = sheet.getRange(i, 4).getValue();

    var file = DriveApp.getFileById(fileID);
    try {
      file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);
      sheet.getRange(i, 6).setValue("Code ran to share with all");
    }
    catch (err) {
      sheet.getRange(i, 6).setValue(err);
    }
  }
}
}

问题是这很慢......(大约每秒 1 个)我想为每个 ID 制作一个数组,然后告诉谷歌,这 1000 个 IDS?请将它们全部分享给 ANYONE_WITH_LINK。

【问题讨论】:

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


    【解决方案1】:

    试试这个方法:

    function grantaccesstoprivateids(){
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getSheetByName('PicturIDs');
      const sr=2;
      const c4=sh.getRange(sr,4,sh.getLastRow()-sr+1).getValues();
      const c6=sh.getRange(sr,6,sh.getLastRow()-sr+1).getValues();
      c6.forEach((c,i)=>{
        if(c[0]=='PRIVATE') {
          let file=DriveApp.getFileById(c4[i+sr][0]);
          try {
            file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);
            c[0]="Code ran to share with all";
          }
          catch(e) {
            c[0]=e;
          }
        }
      });
      sh.getRange(sr,6,c6.length,1).setValues(c6);
    }
    

    可能会快一点。如果没有,则驱动 Drive API

    Best Practices

    【讨论】:

    • 太棒了,我现在一个接一个地浏览了 5000 个文件。您的方法看起来将具有相同的速度,但至少所有内容都在“内存”中,如果电子表格在执行过程中发生更改,则不会出现任何问题。我对您的方法的唯一问题是,如果我超时,那么我将不知道超时发生在哪里,但是在我完成之前不与前端交互可能会使其更快。
    • 要处理 5000 个文件,我怀疑无论您选择哪种课程,您最终都必须找到一种方法,使您可以将流程作为可重新启动的批处理执行。也许跟踪你在哪个 i 将允许跟踪一个可恢复的索引并使用它从你离开的地方重新开始这个过程。
    【解决方案2】:

    向 Drive API 发出批量请求肯定会更快。不过,每批只能调用 100 次。但是您可以发出多个批处理请求。见Drive API batch

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2023-03-28
      • 2017-10-05
      • 2013-12-22
      • 2012-03-02
      • 2012-09-04
      相关资源
      最近更新 更多