2013-06-07 3 views
0

나는 다음과 같은 것을 가지고 있습니다. script.동일한 스프레드 시트의 여러 시트에서 Google 스크립트를 자동으로 실행하는 방법

상황 :

내가 10 개 워크 시트 15 사용자가 로그인하고 수정과 스프레드 시트를 가지고있다.

스크립트 기능 :

Inserts the number of days between two days in the activesheet in a specific column, Script compare date from column J and TodayDay and inserts the difference in the column F.

문제 :

I can not run this script with using timed triggers. I want to run this script every 15 min for the concurrent sheet.

테스트 케이스 :

The trigger only runs with timing if I have only one sheet in the spreadsheet. The trigger doesn't run with timing if I have more than one sheet. The trigger only runs for more than one sheet if I set the same trigger OnEdit.

내가 모든 시트 또는 활성 시트마다 15 분 내가 가지고 있기 때문에이 스크립트를 실행해야합니다 OnEdit를 실행하는 다른 두 개의 스크립트. OnEdit에서도이 스크립트를 설정하면 스프레드 시트가 천천히 돌아옵니다.

function onOpen() { 
     var menuEntries = [ {name: "UpdateAge", functionName: "toTrigger"}, 
         ]; 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     ss.addMenu("Tools",menuEntries);// 
    } 

    // create a timer trigger that will call "toTrigger" every 15 minutes 

    function toTrigger(){ 
     var sh = SpreadsheetApp.getActiveSheet(); 
     var data = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues(); 
     for(var n=0;n<data.length;++n){ 
     if(typeof(data[n][9])=='object'){ 
     data[n][5]=dayToToday(data[n][9]) 
      } 
     } 
     sh.getRange(1,1,data.length,data[0].length).setValues(data) 
    } 

    function dayToToday(x){ 
     var refcell = x;;// get value in column A to get the reference date 
     var refTime = new Date(refcell); 
     var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days 
     var today = new Date(); 
     var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days 
     var day = parseInt(TD-ref);// get the difference in days (integer value) 
     return day ; // return result that will be in cell 
    } 

편집 :

안녕 Srik, 너무 많은 지금 노력하고 있습니다

감사 작업입니다.

function onOpen() { 
     var menuEntries = [ {name: "UpdateAge", functionName: "shellFunction"}, 
         ]; 
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 
     ss.addMenu("Tools",menuEntries);// 
    } 

     function shellFunction(){ 
     var sheets = ['Sheet1','Sheet2','Sheet3','Sheet4']; 
     for (var s in sheets){ 
     toTrigger(sheets[s]); 
     } 
     } 

     // create a timer trigger that will call "toTrigger" every 15 minutes 

     function toTrigger(sheetName){ 
     var ss = SpreadsheetApp.openById('SHEET ID'); 
     var sh = ss.getSheetByName(sheetName); 
     var data = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues(); 
     for(var n=0;n<data.length;++n){ 
     if(typeof(data[n][9])=='object'){ 
     data[n][5]=dayToToday(data[n][9]) 
      } 
     } 
     sh.getRange(1,1,data.length,data[0].length).setValues(data) 
    } 

    function dayToToday(x){ 
     var refcell = x;;// get value in column A to get the reference date 
     var refTime = new Date(refcell); 
     var ref = refTime.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days 
     var today = new Date(); 
     var TD = today.setHours(0,0,0,0)/(24*3600000);// set hours, minutes, seconds and milliseconds to 0 if necessary and get number of days 
     var day = parseInt(TD-ref);// get the difference in days (integer value) 
     return day ; // return result that will be in cell 
    } 
+0

왜 스프레드 시트 기능을 사용하지 않습니까? 소란없이 각 행의 일별 차이를 계산할 수 있습니다. 참조 날짜와 toda의 날짜를 함수 매개 변수로 보내주십시오. – Taras

+0

매번 스프레드 시트가 수정 중이므로 ex에 수식 배열을 사용할 수 없습니다. 해당 행의 활동이 완료되면 삭제됩니다.
예 : 수식을 사용하는 경우 누군가를 새로운 행으로 드래그해야합니다. 오류 또는 복잡한 시트를 피하려면이 스크립트를 사용하여 아무런 문제없이 자동으로 번호를 삽입합니다. 누군가 수식이있는 셀을 삭제하면됩니다.
배열 수식을 사용하지만 새 행을 추가 할 때 수식은 배열을 사용하여 자동으로 끌지 않습니다.
제 경우에는 수식을 구현할 수 없습니다. 어떤 제안이라도 있으면 알려주세요. –

답변

0

함수가 트리거로 실행될 때 활성 시트가 ​​없습니다. 활성 시트는 사용자가 스프레드 시트를 연 경우에만 적용 할 수 있습니다. getSheetByName을 사용하도록 스크립트를 수정하면 모든 것이 잘 작동합니다. 이 여러 시트에서 작업 할 경우

, 그냥 .. 다른 함수에서

function shellFunction(){ 
    var sheets = ['sheet1','sheet2',etc]; 
    for (var s in sheets){ 
    toTrigger(sheets[s]); 
    } 
} 

을이 함수를 호출 인수로 시트 이름을받을 toTrigger 기능을 변경합니다.

function toTrigger(sheetName){ 
    var sh = SpreadsheetApp.openById(ID OF SPREADSHEET).getSheetByName(sheetName); 
    /* Your regular code */ 
} 
+0

설명 : 트리거가 실행되면 서버에서 완전히 독립적 인 프로세스로 실행되며 사용자가 시트를 열 었는지 여부는 알 수 없습니다. onEdit 트리거의 경우 함수는 트리거 원본에 대한 정보가 포함 된 이벤트를받습니다. 타이머 기반 트리거는 이러한 이벤트를 가져 오지 않습니다. 따라서 사용자가 타이머 기반 트리거가 실행될 때 시트가 열린 경우에도 트리거 기능은 사용자가보고있는 시트를 알 수 없습니다. – Mogsdad

+0

원하는 항목 : 사용자가 스프레드 시트에 로그인하면 15 분마다 스크립트를 실행해야합니다. (참고 :이 스크립트에는 2 명의 사용자가 동시에 기록됩니다.) 1- getsheetbyName을 사용하여 10 개의 시트로 실행되도록이 스크립트를 어떻게 수정할 수 있습니까? 귀하의 도움에 감사드립니다. –

+0

Srik,이 스프레드 시트에서 더 많은 스크립트를 실행하도록이 스크립트를 설정하는 방법을 알고 계십니까? 내 문제는 내가 getSheetbyName을 사용하는 경우에만 1 시트 걸릴. 그 스크립트를 15 분마다 10 장씩 실행해야합니다. –

관련 문제