1

Ich habe ein einfaches Addon für meine Firma erstellt. Wenn das Addon aufgerufen wird, sieht es sich das aktuelle Blatt an und ersetzt alle Zellen durch den entsprechenden Wert in einem gegebenen Glossar.Externes Blatt in Google Apps Sheet laden Addon

Zum Beispiel wird es alle Zellen mit dem Wert „Brand“, finden und ersetzen sie durch „123_brand“ ersetzt „Name“ durch „321_name“ usw.

Um dies zu tun, verwende ich eine lokale Blatt ("Glossarblatt"), mit all diesen Daten in seinen Reihen (die erste Spalte hat "Marke", "Name" usw., während die zweite Spalte "123_brand", "321_name", usw.) hat. Alle Mitglieder meiner Firma haben die Autorisierung auf diesem Blatt gelesen.

ich laden Sie es auf folgende Weise:

function onOpen() { 
    SpreadsheetApp.getUi().createAddonMenu() 
     .addItem('Parse sheet', 'parseSheet') 
     .addToUi(); 
} 

function onInstall(){ 
onOpen(); 
} 

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

function parseSheet(){ 
    /* Does the sheet parsing */ 
} 

Problem ist: Es funktioniert nicht.

Direkt nach der Installation erscheint die Schaltfläche "Parse Sheet" normal, alles funktioniert. Geht der Benutzer jedoch zu einem anderen Blatt, funktioniert das Addon dort nicht. Das Überprüfen der Konsole zeigt die folgende Meldung an:

Google Apps Script: Sie sind nicht berechtigt, diese Aktion auszuführen.

Wenn der Benutzer das Addon in diesem anderen Blatt entfernt und neu installiert, wird es wieder normal arbeiten.

Ich habe versucht, Bearbeitungsberechtigung stattdessen zu geben, aber es funktioniert immer noch nicht. Dies gilt für alle Benutzer, auch für mich selbst.

Warum wird meinem Addon der Zugriff auf eine externe Tabelle verweigert, außer direkt nach der Installation?

+1

Ich vermute, dass es etwas mit dem "Authorization Mode" zu tun hat. Quote: *** Wenn ein Add-On aus dem Speicher installiert wird, wird seine onInstall (e) -Funktion in AuthMode.FULL ausgeführt. *** Der AuthMode kann sich ändern, nachdem das Add-On installiert wurde. Haben Sie den [Link zum Add-on-Autorisierungs-Lebenszyklus] (https://developers.google.com/apps-script/add-ons/lifecycle) gelesen? –

+0

Wenn Sie sagen, dass das Add-On nicht funktioniert, meinen Sie, dass Sie es nicht tun. Sehen Sie sich dieses spezielle Addon im Add-On-Menü an? –

+0

@JackBrown Ich meine, dass ich das Addon im Addons Menü sehe, aber keine seiner Funktionen sind da, nur "Hilfe" –

Antwort

1

Diese globale Erklärung ist er Grund, warum Sie nicht Ihre Add-on-Menü-Funktion in Ihrem Add-on zu sehen sind:

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

Diese globale ist delcaration das heißt nicht in Ihrer Funktion erklärt. Dies wird ausgeführt, wenn Ihre onOpen() -Funktion zum Zeitpunkt des Öffnens eines neuen Dokuments aufgerufen wird. Dies ist ein Zitat aus der Dokumentationsseite

Warnung: Wenn Ihre onOpen (e) -Funktion ausgeführt wird, wird das gesamte Skript geladen und alle globalen Anweisungen ausgeführt. Diese Anweisungen werden im selben Berechtigungsmodus wie onOpen (e) ausgeführt und schlagen fehl, wenn der Modus sie verbietet. Dies verhindert, dass onOpen (e) ausgeführt wird. Wenn Ihr veröffentlichtes Add-on seine Menüelemente nicht hinzufügen kann, sehen Sie in der JavaScript-Konsole des Browsers nach, ob ein Fehler aufgetreten ist. Untersuchen Sie dann Ihr Skript, um zu ermitteln, ob die Funktion onOpen (e) oder globale Variablen nicht zulässige Dienste aufrufen in AuthMode.NONE.

Das Addon ist installiert und nicht in der neuen Tabelle aktiviert, so dass es in der authMode.None Berechtigung ausgeführt wird. In diesem Autorisierungsmodus verfügt er nicht über die Berechtigung, eine Tabelle zu öffnen. Die globalen Deklarationen schlagen fehl und onOpen wird vorzeitig beendet, ohne dass Sie Ihre Menüelemente hinzufügen.

Mein Vorschlag, es zu beheben das ist folgende einfach die ganze Erklärung in Ihre parseSheet Funktion

function parseSheet(){ 
var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
    /* Does the sheet parsing */ 
} 

oder Sie versuchen, dies zu tun bewegen kann, wenn Sie librarySpreadsheet wollen eine globale Variable sein:

var librarySpreadsheet 
function parseSheet(){ 
    librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
     /* Does the sheet parsing */ 
    } 

Schließlich, warum funktioniert das bei der Neuinstallation? (Wurde bereits von @SandyGood in den Kommentaren beantwortet!) Nach der Installation wird das Addon in authoMode.FULL ausgeführt, da für die Autorisierung eine Benutzerinteraktion erforderlich ist. Zitat von der Dokumentation

Wenn eine Add-on aus dem Speicher installiert ist, sein onInstall (e) Funktion läuft in AuthMode.FULL

Deshalb wird, wenn es neu installiert wird es in der Lage, dass die globalen zu bekommen Deklaration und aktiviert auch das Addon für dieses Dokument. Daher funktioniert das Addon gut für zukünftige Läufe und auch für dieses Dokument

+0

Das war es, danke! –

Verwandte Themen