2017-05-05 6 views
0

나는 몇 가지 문제점을 가지고 있으며 몇 가지 조언을 정말 좋아할 것입니다. 며칠 동안 두통이있었습니다.Google 스프레드 시트에 날짜가 갈 때마다 자동으로 범위 (열)가 잠 깁니까?

나는 그날 완료 한 작업에 대한 정보로 직원들이 매일 업데이트 할 시트가 있습니다. 각 열에는 머리글 행 (이 경우 행 3)에 날짜가 있고 그 다음날이 끝나면 해당 열을 잠궈 서 자신과 다른 사람 외에는 더 이상 편집 할 수 없도록합니다. 이는 사람들이 실수를 은폐하거나 실수로 데이터를 변경하거나 삭제하지 못하도록 방지하기위한 것입니다.

저는 이것을 수행 할 스크립트 또는 무언가를 찾고 있습니다. 이 시트는 약 45 개의 탭이 있으며 모두 동일한 것을 적용해야합니다. 내 아이디어는 헤더 행의 날짜를 기준으로 특정 시간에 트리거하는 스크립트 일 수 있습니다. 따라서 날짜가 2017 년 5 월 5 일이면 해당 열은 6 일 자정에 자물쇠를 채 웁니다.

내 시트 사본에서 마이너스 데이터로 연결되는 링크는 here입니다.

또는 최근 데이터가 입력 된 후 24 시간이 지나면 단순히 셀을 잠그고 선택한 사람을 제외한 모든 사람이 더 이상 편집하지 못하게하는 경우 이상적인 방법을 사용할 수없는 경우에도 작동 할 수 있습니다. .

귀하의 조언을 위해 미리 감사드립니다.이 프로젝트는 정말 도움이 될 것입니다. 정말 도움이되어 주셔서 감사합니다.

답변

0

예,이 방법이 있습니다.

간략 솔루션을 설명합니다 :

  1. 이의 첫 번째 행이 1:1 연속 날짜가 포함되어 있습니다한다고 가정 해 봅시다.
  2. 새로운 protected 범위를 생성하는 lockColumns 함수를 만듭니다.
  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() 
); 
}