2017-11-22 3 views
2

schützen eine Reihe von Apps Script zu viel Zeit in Anspruch nimmt Einige Kontext

  • ich die Übersetzungen meiner Web App verwalten obwohl eine Google-Tabelle, auf die ich Übersetzer einladen
  • Es gibt 30 Blätter, jeweils ein Teil der App (große App).
  • Es gibt 14 Spalten auf jedem Blatt, 1 Spalte/Sprache.

Was ich

tun will, wie ich schon zweimal hatte ein Problem mit Übersetzern aus Versehen die falsche Spalte bearbeiten, mag ich protected columns einstellen Ausgabe nur für jeden Übersetzer beschränken auf die Säule seines Sprache (1 Übersetzer = 1 E-Mail-Adresse gewährt Zugriff auf die Tabelle).

Wie ich es tat

Einstellung manuell ein Schmerz (sich wiederholende Aufgabe) ist, und muss wieder, wenn ein Übersetzer Wechsel erfolgen. Also habe ich ein Skript dafür geschrieben.

Wie i gespeicherten Berechtigungen:

var ProtectionsDefinitions = [{ 
    langHeader: "en", 
    emails: ["[email protected]"] 
},{ 
    langHeader: "fr", 
    emails: ["[email protected]"] 
} 
...] 

Pseudo-Code:

For every sheet: 
    For every language: 
     Protect the column whose header match the langHeader 

Echt Code für die Funktion, die die eigentliche Arbeit tun:

function setProtection(range, rangeDesc, emails) { 
    // range = class range 
    // rangeDesc = string (description for protected range) 
    // emails = [[email protected], [email protected]] 

    var protection = range.protect(); // Creates an object that can protect the range from being edited except by users who have permission. 
            // Until the script actually changes the list of editors for the range 
            // the permissions mirror those of the spreadsheet itself, which effectively means that the range remains unprotected. 
    protection.removeEditors(protection.getEditors()); // this takes more than 1s ! 
    protection.setDomainEdit(true); // all users in the domain that owns the spreadsheet have permission to edit the protected range 
    protection.setDescription(rangeDesc); 
    if(emails.length > 0){ 
    // this takes more than 1s !! 
    range.getSheet().getParent().addEditors(emails); // give the users permission to edit the spreadsheet itself, required for protection.addEditors() 
    protection.addEditors(emails); // give the users permission to edit the protected range 
    } 
} 

Warum dies nicht der Befriedigung

  • Die Funktion setProtection nimmt für jeden Bereich zu schützen 2s
  • I haben 30 Blatt * 14 Spalten = 420 Bereiche zu schützen. Siehe Kommentare in der Funktion
  • Die gesamte Ausführung überschreitet von Google Apps Script (~ 6 min) erlaubt maximale Zeit

ich die Linien verfolgt, die eine Menge Zeit dank der Logging-Tool nimmt.

Ich frage mich, ob ich etwas tun kann, damit es funktioniert.

Beispiel Tabelle

Antwort

1

Sie auf die Early Access Program anwenden könnten oder anstatt Prozess alle Blätter/Spalten mit einem einzigen Skriptaufruf, spaltete den Job.

Ideen für Lösungen:

Verwandte Q & A

+0

Dank für das Early Access Programm zu erwähnen (nicht darüber wissen) und Dank gilt auch den Auslöser für die Erwähnung Lösung. [Diese Antwort] (https://stackoverflow.com/a/43587255/1570104) scheint eine minimale Möglichkeit zu bieten, die Trigger-Lösung zu implementieren. In meinem Anwendungsfall denke ich, dass ich den Job nur in drei Teile aufteilen werde, die Implementierung von Triggern sieht für mich wie eine Überoptimierung aus, aber es war sehr interessant zu verstehen, wie das mein Problem lösen würde. – edelans

Verwandte Themen