2017-08-28 3 views
0

Mon script prend 35 noms d'élèves de la feuille 'Studenti'. Puis trouve le bon dossier avec son nom (c.-à-d. «Smith Peter»), enlève le vieux document pdf avec de vieux grades tenant leur nom (c.-à-d. «Smith Peter.pdf») et sauvegarde dans le dossier un nouveau pdf document avec de nouvelles notes («Smith Peter.pdf»). Et va prendre un autre étudiant de la liste. Le problème: après 1,2 ou 3 itérations, le script arrête de dire: Accès refusé: DriveApp. (ligne 22, fichier "Code": files.next(). setTrashed (true);). Il y a une semaine, le script fonctionnait sans problèmes, j'ai essayé de changer les noms, les dossiers, les destinations, les sources et les conseils vérifiés ici. Mais pas de succès. Je ne sais pas quel est le problème avec la ligne 22. S'il vous plaît, aidez!Student Gradebook. Impossible de terminer le script à cause de "Accès refusé: DriveApp"

Le code est joint

Execution transcript (spectacles où le script a arrêté)

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 
 
    
 
} 
 
}

Répondre

0

Dans le SO post, l'utilisateur tente de supprimer le fichier converti et a obtenu le même erreur que vous êtes.

Je suppose que vous atteignez une limite de débit. Si vous effectuez plus de 20 opérations d'écriture (créer, mettre à jour, supprimer) en succession rapide, vous avez besoin d'étrangler les demandes à environ un toutes les 1,5 secondes.

La raison suspectée est la limite de fréquence de frappe de l'utilisateur. Puisque vous mettez également à jour une donnée, il y a aussi une possibilité que c'est la raison pour laquelle elle travaille sur la première exécution et a atteint la limite après.

Et c'est le seul débit maximum alloué que vous pouvez atteindre dans Drive.

0

Après quelques expériences, j'ai trouvé les racines du problème mais pas la solution. Le problème avec "Accès refusé" était lié au fait que je n'étais pas le propriétaire du fichier créé par mon script et que seul le propriétaire du fichier peut effacer ou supprimer le fichier. Bien que j'étais l'auteur du script et que j'avais des droits d'édition sur le fichier qui était placé sur mon disque, cela ne fonctionnait pas. D'autre part, je pouvais supprimer/trash le fichier manuellement sans problèmes (et c'était trompeur pour moi).

Leçon apprise: Si vous permettez à quelqu'un d'autre d'utiliser votre script qui crée un nouveau fichier et trashes aussi l'ancien que vous ne pouvez probablement pas terminer votre script suivant SICE fois que vous n'êtes pas autorisé (Accès refusé) aux ordures la fichier créé par un autre utilisateur (bien que le fichier ait été créé sur votre propre lecteur!). Ajusté question: Est-ce que quelqu'un sait comment écrire le script pour jeter/supprimer le fichier dont je ne suis pas le propriétaire (mais j'ai des droits d'édition) et qui a été créé par un autre utilisateur sur mon disque?