2017-05-05 3 views
0

Ich habe ein Problem und würde gerne einige Hinweise lieben, das war ein paar Tage Kopfschmerzen.Automatisches Sperren eines Bereichs (Spalte) für jedes Datum in Google Tabellen?

Ich habe ein Blatt, dass Mitarbeiter täglich mit Informationen über Aufgaben an diesem Tag aktualisiert werden. Jede Spalte hat ein Datum in der Kopfzeile (in diesem Fall Zeile 3), und nach dem Ende des folgenden Tages möchte ich, dass diese Spalte gesperrt wird, so dass sie nicht weiter bearbeitet werden kann, außer von mir selbst und einer anderen. Dies soll verhindern, dass Personen Fehler vertuschen oder versehentlich Daten ändern oder löschen.

SO suche ich nach einem Skript oder etwas, das dies erreichen wird. Dieses Blatt hat etwa 45 Tabs und ich brauche das gleiche für alle. Meine Idee ist möglicherweise ein Skript, das zu einem bestimmten Zeitpunkt basierend auf dem Datum in der Kopfzeile ausgelöst wird, also wenn das Datum 5. Mai 2017 ist, würde sich die entsprechende Spalte um Mitternacht am 6. sperren.

Ein Link zu einer Kopie meines Blattes, minus Daten ist here.

Alternativ, wenn es eine Möglichkeit gibt, eine Zelle 24 Stunden nach dem Eintragen der letzten Daten zu sperren, und die weitere Bearbeitung durch alle außer ausgewählte Personen zu verhindern, könnte das auch funktionieren, wenn die ideale Methode nicht möglich ist .

Vielen Dank im Voraus für Ihren Rat, dieses Projekt wird wirklich meiner Firma helfen und ich schätze diese Gemeinschaft sehr, weil sie so hilfreich ist!

Antwort

0

Ja, es gibt einen Weg, dies zu tun.

Ich werde kurz die Lösung beschreiben:

  1. sagen lassen, dass die erste Reihe hat 1:1 aufeinanderfolgende Termine enthält.
  2. Erstellen Sie die Funktion lockColumns, die neue protected Bereich erstellen würde.
  3. Fügen Sie die Funktion lockColumns zum Zeitauslöser hinzu, der jeden Tag zwischen 0:01 und 1:00 Uhr ausgelöst wird.

Und jetzt einige Code:

function lockColumns() { 
    var ss = SpreadsheetApp.getActive().getSheetByName('Sheet 1') 
    var range = ss.getRange('1:1').getValues()[0]; 
    var today = new Date(); 
    var todayCol = null; 
    for (var i=0; i<range.length; i++) {  
    if (today.isSameDateAs(range[i])) { 
     todayCol = i; 
     break; 
    } 
    } 

    var rangeToProtect = ss.getRange(1, todayCol +1, ss.getMaxRows(), 1) 
    var protection = rangeToProtect.protect().setDescription('Protected range'); 

    // Ensure the current user is an editor before removing others. Otherwise, if the user's edit 
    // permission comes from a group, the script will throw an exception upon removing the group. 
    var me = Session.getEffectiveUser(); 
    protection.addEditor(me); 
    protection.removeEditors(protection.getEditors()); 
    if (protection.canDomainEdit()) { 
    protection.setDomainEdit(false); 
    } 
    protection.addEditor('[email protected]'); // second person with edit permissions 
} 

/* 
http://stackoverflow.com/a/4428396/2351523 
*/ 
Date.prototype.isSameDateAs = function(pDate) { 
    return (
    this.getFullYear() === pDate.getFullYear() && 
    this.getMonth() === pDate.getMonth() && 
    this.getDate() === pDate.getDate() 
); 
} 
Verwandte Themen