学生成绩册。由于“拒绝访问:DriveApp”

时间:2017-08-28 13:35:13

标签: javascript pdf google-sheets google-drive-api

我的脚本从Sheet'Studenti'中获取35个学生姓名。然后找到带有他们名字的正确文件夹(即'Smith Peter'),删除旧的pdf文档,其中包含旧名称(即'Smith Peter.pdf')并保存到文件夹('Smith Peter')新制作的pdf新成绩的文件('Smith Peter.pdf')。然后从列表中选择另一名学生。

问题:经过1,2或3次迭代后,脚本停止说:拒绝访问:DriveApp。 (第22行,文件“Code”:files.next()。setTrashed(true);)。一周前,脚本工作没有问题,我试图在这里更改名称,文件夹,目的地,源表和检查建议。但没有成功。我不知道22号线有什么问题。请帮忙!

附上代码

Execution transcript(显示脚本停止的位置)

function generatePdf() {

var report = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Gradebook ready to save as pdf
var zasobnik = SpreadsheetApp.openById('1eygLDH0iJoXfcVOMIin0hnKpMF59HszmXZosPKvwYWc');  
var zasobsheet = zasobnik.getSheetByName("Studenti"); // list of 35 students with names, Folder IDs
var data = zasobsheet.getDataRange().getValues(); 
  
for (var i = 1; i < data.length; i++){
    report.getRange('B2').setValue(data[i][0]); // setting student's name in a gradebook (first column)
    report.getRange('B3').setValue(' '); // just to jump from B2 to B3
  
var pdf = DriveApp.getFileById('1WHwm7xK28Orj22RxaKWEsCl3UWvWxYUhRg4ZGf87-GQ'); // ID of Gradebook (IF of ActiveSpreadsheet)
var theBlob = pdf.getBlob().getAs('application/pdf').setName(data[i][0] + ".pdf");
var folder = DriveApp.getFolderById(data[i][2]); // third column
  
var files = DriveApp.getFilesByName(data[i][0] + ".pdf"); // pdf with old grades
      while (files.hasNext()) {    
       files.next().setTrashed(true);    
   }
var newFile = folder.createFile(theBlob); // creating pdf with new grades in the student's folder
 
 }
}

4 个答案:

答案 0 :(得分:1)

经过几次实验,我找到了问题的根源,但没有找到解决方案。问题&#34;访问被拒绝&#34;与此事实有关,我不是我的脚本创建的文件的所有者,只有该文件的所有者可能会删除或删除该文件。虽然我是该脚本的作者并且已编辑放在我的驱动器上的文件的权限,它没有用。另一方面,我可以手动删除/删除文件而没有问题(这对我来说是误导)。

获得的经验教训:如果您允许其他人使用您创建新文件的脚本并且还会破坏旧文件,那么下次您可能无法完成脚本时您将无法访问(拒绝访问) )删除其他用户创建的文件(尽管该文件是在您自己的驱动器上创建的!)。

调整后的问题:是否有人知道如何编写脚本来删除/删除我不是所有者的文件(但我有编辑权限),这是由我的其他用户创建的驱动?

答案 1 :(得分:1)

我对垃圾文件有同样的问题,这不是我所拥有的。 我发现了

  1. 如果您在清单getEditors()或getViewers()上,我有解决方法:只是撤销您自己的许可。 file.revokePermissions(Session.getActiveUser());文件将消失。
  2. 如果文件设置了isShareableByEditors(),则示例1不起作用-如果它为“ false”,则您将无能为力。
  3. 如果您已将文件添加到驱动器中,并且每个人都可以通过链接公开访问该文件,则您将无法撤消权限,因为您没有该权限。应用脚本返回访问被拒绝。因此,我认为我可以setTrashed(true)。我错了。 Google还会返回访问被拒绝:DriveAp。

在通过应用程序脚本2和3的情况下,我找不到从驱动器中删除不需要的文件的方法。但是仍然可以通过单击它们并选择选项“删除”来实现。

答案 2 :(得分:0)

SO post中,用户正在尝试删除转换后的文件并获得与您相同的错误。

  

我怀疑你正在达到速率限制。如果你做的超过20   快速连续编写操作(创建,更新,删除),你   需要将请求限制在大约每1.5秒一次。

可疑原因是用户点击率限制。由于您也在更新数据,因此也有可能这就是为什么它正在处理前几次执行并在之后达到限制。

这是您在Drive中可以实现的唯一分配的最大吞吐量。

答案 3 :(得分:0)

就我而言,临时文件是定期重新创建的,revoking my user permission 会将原始文件保留在所有者的云端硬盘中,这可能会在协作时产生意想不到的后果。

相反,

  • 我创建了一个临时文件夹。
  • 在代码运行后将文件移动到文件夹中。
  • 删除文件夹。
var fileToDelete = DriveApp.getFileById(fileId);
var parentFolder = fileToDelete.getParents().next();
// Create the temp-folder inside the current parent folder
var deleteFolder = parentFolder.createFolder("TempFolder");
fileToDelete.moveTo(deleteFolder);
DriveApp.getFolderById(deleteFolder.getId()).setTrashed(true)

确认;该文件和文件夹已从我的驱动器以及所有者的驱动器中删除。这与我在实现此代码之前所拥有的 the understanding 相矛盾。