学生成绩册。由于“拒绝访问:DriveApp”,无法完成脚本

问题描述 投票:1回答:3

我的脚本从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
 
 }
}
javascript pdf google-sheets google-drive-sdk
3个回答
1
投票

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

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

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


1
投票

我有同样的问题与垃圾文件,我不拥有。我找到

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

在第2和第3例应用程序脚本中,我没有找到从驱动器中删除不需要的文件的方法。但是仍然可以点击它们并选择“删除”选项。


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.