2012-07-31 6 views
0

캘린더에서 약속을로드하는 스프레드 시트에 Google 스크립트가 있습니다. 약속 시간을 계산합니다. 하지만 캘린더 항목을 업데이트하는 데는 시간이 오래 걸리며 시간 초과 오류가 발생합니다. 일정에서 약속을 가져 오는 것은 문제가 아닙니다. 스크립트 아래에 언급 된 스프레드 시트의 10 개 탭마다 쿼리 속도가 느려 집니까?스프레드 시트의 Google 캘린더에서 스크립트 로딩 약속 속도 향상

function updateUren() 
{ 

    var cal = CalendarApp.openByName("Uren"); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Uren"); 

    //set first row 
    var details=[["title", "date", "start", "end", "duration"]]; // events[i].getDescription(), 
    var range=sheet.getRange(2,1,1,5); 
    range.setValues(details); 

    //gets the year from Boekjaar 
    var year = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Boekjaar").getRange(2,1,1,1).getValue(); 

    var events = cal.getEvents(new Date("January 1, "+year), new Date("December 31, "+year)); 
    if(events.length == 0) 
    { 
    Browser.msgBox('No events found for year: "' + year + '"'); 
    } 
    for (var i=0;i<events.length;i++) { 
    //http://www.google.com/google-d-s/scripts/class_calendarevent.html 
    var startTime = events[i].getStartTime(); 
    var endTime = events[i].getEndTime(); 
    var durationHours = (endTime - startTime)/(1000*60*60); 
    var details=[[events[i].getTitle(), startTime, startTime, endTime, durationHours]]; // events[i].getDescription(), 
    var row=i+3; 
    range=sheet.getRange(row,1,1,5); 
    range.setValues(details); 
    } 
    var foo = "foo"; 
}

내가 여기에 표시 한 쿼리를 실행하는 10 개의 탭이 있습니다. 그들은 비싼하고 updateUren() 함수를 호출하는 동안 일을 늦추고 특정 기간

=QUERY (Uren!A:E, "SELECT B, SUM(E) WHERE A CONTAINS 'SomeKeyWord' AND B>=DATETIME '2012-6-18 00:00:00' 
AND B<DATETIME '2012-7-16 00:00:00' GROUP BY B PIVOT A'")

의 약속 시간을 필터링?

누구나 답변을 알고 계십니까?

+0

코드가 불완전 해 보입니다. openByName() 호출이 지연의 원인이라는 것을 어떻게 알았습니까? 전체 코드를 여기에 붙여주십시오. – Srik

+0

코드가 불완전합니다 ... 확인해 주시겠습니까? thanks –

+0

죄송합니다, 문자 인코딩을 잊어 버렸습니다. –

답변

1

QUERY 함수가 데이터에 액세스하는지 여부는 확실하지 않지만 내 이해는 루프 내부에서 가져 오기/설정을 수행하지 않는 것이 좋습니다. 이렇게하면 작업 속도가 느려질 수 있습니다. 상당히. 대신 배열을 먼저 작성한 다음 하나의 setValues ​​() 호출로 설정하십시오.

function updateUren() 
{ 

    var cal = CalendarApp.openByName("Uren"); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Uren"); 

    //create first row of 2D array 
    var details=[["title", "date", "start", "end", "duration"]]; // events[i].getDescription(), 

    //gets the year from Boekjaar 
    var year = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Boekjaar").getRange(2,1,1,1).getValue(); 

    var events = cal.getEvents(new Date("January 1, "+year), new Date("December 31, "+year)); 
    if(events.length == 0) 
    { 
    Browser.msgBox('No events found for year: "' + year + '"'); 
    } 

    for (var i=0;i<events.length;i++) { 
    //http://www.google.com/google-d-s/scripts/class_calendarevent.html 
    var startTime = events[i].getStartTime(); 
    var endTime = events[i].getEndTime(); 
    var durationHours = (endTime - startTime)/(1000*60*60); 
    details.push([events[i].getTitle(), startTime, startTime, endTime, durationHours]); // events[i].getDescription(), 
    } 
    sheet.getRange(2, 1, details.length, 5).setValues(details); 
    //var foo = "foo"; 
} 

편집 : 여전히 루프 내부의 캘린더 서비스에 대한 전화를 걸고 있습니다. 나는 이것이 테스트되지 않았지만 차이가 나는지 듣고 싶다고 덧붙여 야한다.

+0

루프에서 setValues ​​()가 병목 현상을 일으켰습니다! –

+0

왜 왜 breakpoint가있는 디버거에서 스크립트를 재생하는지 이해하지 못했습니다. var foo = "foo"; 그렇게 오랜 시간이 걸렸지 만 쿼리라고 생각했는데 setValues가 여전히 바쁜 작업이었습니다! 당신은 정말로 나를 도왔습니다! –

+0

실제로 느린 이유 느린 이유 : setValues ​​()가 루프에서 호출 될 때마다 10 개의 쿼리가 실행되기도했기 때문에 탭에서 10 개의 쿼리가있는 루프에서 setValues ​​()를 사용하는 것도 원인 일 수 있습니다. . –

관련 문제