2013-01-15 6 views
0

Contexte: J'ai un site google et j'ai extrait des informations d'une feuille de calcul google contenant les notes de mes étudiants, mais je voudrais la rendre plus dynamique afin qu'ils puissent demander un rapport de tous de leurs marques actuelles quand ils le voudraient. Dans le script que j'ai écrit, les élèves entreront un mot de passe, cliqueront sur un bouton, puis leurs notes seront générées. Problème: D'après ce que j'ai lu, lorsqu'ils cliquent sur le bouton, le gestionnaire du bouton provoque la réexécution du script. La feuille de calcul actuelle ne peut pas être stockée et lorsque j'essaie d'accéder à la feuille de calcul, elle me dit que c'est null. Comment puis-je à nouveau accéder à la feuille de calcul? J'ai essayé d'utiliser ScriptProperties, mais j'ai obtenu le même résultat. En passant, cela fonctionne si je n'essaie pas de l'exécuter en tant que webapp.Google Apps Script Persistence

Voici la fonction doGet() et une partie de la fonction getPassword() qui est appelée une fois que le bouton de l'interface utilisateur est enfoncé.

function doGet() { 
    var app = UiApp.createApplication(); 
    app.add(app.loadComponent("MyGui")); 

    var panel = app.getElementById("VerticalPanel1"); 
    var text = app.createPasswordTextBox().setName("text"); 
    var handler = app.createServerHandler("getResults").addCallbackElement(text); 

    panel.add(text); 
    panel.add(app.createButton("Get Record", handler)); 

    SpreadsheetApp.getActiveSpreadsheet().show(app); 
} 

function getResults(eventInfo) { 
    var app = UiApp.createApplication(); 
    var password = eventInfo.parameter.text; 

    var panel = app.getElementById("VerticalPanel1"); 
    var textArea = app.createRichTextArea(); 
    panel.add(textArea); 

    var pointsSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var passwordCheckRange = pointsSheet.getRange("B70:C94").getValues(); 
    ... 

Répondre

0

Le problème est probablement que lorsque le script est exécuté comme Theres WebApp pas "activeSpreadSheet" si SpreadsheetApp.getActiveSpreadsheet() getActiveSheet(). échoue. Une approche alternative sera de passer l'identifiant SpreadSheet dans un champ caché au rappel.

Dans votre fonction doGet:

var hidden = app.createHidden('ssId', 'YOUR_SS_ID_HERE'); 
panel.add(hidden); 
var handler = app.createServerHandler("getResults").addCallbackElement(text); 
handler.addCallbackElement(hidden)` 

Dans votre fonction de rappel

var ssID = eventInfo.parameter.ssId; 
var pointsSheet = SpreadsheetApp.openById(ssID).getSheetByName('SHEET_NAME'); 
+0

Vous n'avez pas besoin de passer l'ID en tant que paramètre, il est une valeur constante qui est disponible à tout moment. D'un autre côté, une fonction webapp doGet ne devrait pas se terminer par "show (app)" –