2017-05-05 49 views
0

我有一個問題,真的會喜歡一些指針,這已經是頭疼幾天了。每個日期在Google表格中傳遞時自動鎖定範圍(列)?

我有一張工作表,員工每天都會更新關於當天完成的任務的信息。每一列在標題行(本例中爲第3行)中都有一個日期,並且在第二天結束後,我希望該列鎖定,以便除了自己和另一個之外不能進一步編輯。這是爲了防止人們掩蓋錯誤或意外更改或刪除數據。

因此,我正在尋找一個腳本或將完成此任務的東西。這張表大約有45個標籤,我需要將相同的東西應用於所有標籤。 我的想法可能是一個基於標題行日期的特定時間觸發的腳本,所以如果日期是2017年5月5日,那麼相應的列將在6日午夜鎖定自己。

鏈接到我的工作表副本,減去數據是here

或者,如果有一種方法可以在最近的數據輸入後24小時內簡單地鎖定任何單元格,並防止除選擇人員之外的所有人進一步編輯,如果理想方法不可行。

非常感謝大家的建議,這個項目真的能幫助我的公司,我真的很感謝這個社區對我的幫助很大!

回答

0

是的,有一種方法可以做到這一點。

我將簡要介紹瞭解決方案:

  1. 比方說,第一行有1:1包含連續的日期。
  2. 創建功能lockColumns這將創建新的protected範圍。
  3. 添加功能lockColumns時間觸發,每天在0:01和凌晨1:00之間觸發。

現在一些代碼:

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() 
); 
} 
相關問題