【问题标题】:Access denied Drive App when trying to delete file尝试删除文件时访问被拒绝的 Drive App
【发布时间】:2017-07-06 21:27:04
【问题描述】:

我写了一个小脚本来将我谷歌驱动器中的所有.xls.xlsx 文件转换为谷歌表格。但是,脚本的结果非常不可靠,有时我会在代码的某个随机部分出现错误,说:“我们很抱歉,发生了服务器错误。请稍等,然后重试。”。在其他时候,我在尝试删除已转换的.xls.xlsx 文件的行上收到一条错误消息,提示“访问被拒绝驱动器应用程序”。我已经为 Drive API 启用了 Advance Google Services。

function convertFolder(folder){
  Logger.log('Folder name '+folder.getName());
  var files = folder.searchFiles('(title contains ".xlsx" or title contains ".xls") and (not title contains ".~lock")');
  while(files.hasNext()){
    var xFile = files.next();
    var name = xFile.getName().replace(/\.[^/.]+$/, "");
    Logger.log('File name '+name);
    if (name.indexOf(".~lock")!=-1)
      continue; //for some reason the "and (not title contains ".~lock")" didn't do the trick - why!?!
    var parents = xFile.getParents();
    var parents_arr = new Array();
    while (parents.hasNext()){
      parents_arr.push({'kind':"drive#fileLink",'id':parents.next().getId()});
    }

    var ID = xFile.getId();
    var xBlob = xFile.getBlob();
    var newFile = { title : name+'.gsheet',key : ID, parents: parents_arr, mimeType: "application/vnd.google-apps.spreadsheet"};
    file = Drive.Files.insert(newFile, xBlob, {convert: true});
    xFile.setTrashed(true);
  }
  var folders = folder.getFolders();
  while (folders.hasNext())
    convertFolder(folders.next());
}

function convertAllExcel(){
  var folders = DriveApp.getFoldersByName('Data');
  while (folders.hasNext()){
    var folder = folders.next();
    convertFolder(folder);
  }
  SpreadsheetApp.getUi().alert("done");
}

【问题讨论】:

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


    【解决方案1】:

    我怀疑你达到了速率限制。如果您连续快速执行 20 次以上的写入操作(创建、更新、删除),则需要将请求限制为大约每 1.5 秒一次。

    您可能在想“wtf”,但这确实是您可以使用 Drive 实现的最大吞吐量。

    【讨论】:

    • 关于删除文件时的“访问被拒绝”是因为我试图删除另一个用户拥有的文件。不幸的是,只有所有者可以丢弃该文件。我将限制我的代码以查看其他错误是否消失。
    • 在此处查看有关删除驱动器中的文件但由其他用户拥有的问题的更多详细信息stackoverflow.com/questions/45920379/…
    【解决方案2】:

    我遇到了类似的问题!虽然以主用户身份运行脚本似乎没有最大吞吐量限制,但与其他用户共享文档并让他们运行在其他用户驱动器中执行写入操作的脚本确实如此。 '实用程序.sleep(1500);'对我有用。

    delFolder = DriveApp.getFolderById("folder_id") 
    delFiles = delFolder.getFiles();
    
    while (delFiles.hasNext()) {
      var delFile = delFiles.next();
      Utilities.sleep(1500);
        delFile.setTrashed(true);
    

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多