1

저는 현재 회사에서 매주 수행하는 작업 중 하나를보다 쉽게 ​​만들기 위해 새로운 스프레드 시트를 개발하고 있습니다. 데이터를이 스프레드 시트로 가져온 다음 작동시키는 방식입니다. 스크립트는 우리가 사용하는 보고서를 생성하기 위해 실행됩니다. 아래는 스프레드 시트의 한 부분을 작성하기 위해 만든 스크립트 중 하나의 예입니다.Google Apps Script - 최대 실행 시간을 초과했습니다.

스프레드 시트로 수동으로 가져온 데이터에는 최대 3000 개의 셀 정보가 포함될 수 있으므로 셀 검사 루프가 필요합니다. 그러나이 스크립트가 실행될 때마다 최대 1617 행까지 올라오고 최대 오류를 초과합니다 실행 시간 - 필자가 사용하는 보고서를 생성하는 데 도움이되는 스크립트가 여러 개 있어야하므로이 문제를 피할 수있는 방법이 있습니까?

6 매가 있으며, 각 시트에는 가져온 데이터의 셀 값에 따라 데이터가 입력됩니다.

function WorkoutTotals() { 
// ----------------------------------------------------------------------------- 
// This function is used for working out the totals of each centre 
// ----------------------------------------------------------------------------- 
var value; 
for (var j = 2; j < abignumber; j++) { 
    var rawcentres = rawdata.getRange(j, 1); 
    var rawcategory = rawdata.getRange(j, 6); 
    switch (rawcentres.getValue()) { 
    case centres[0]: 
     centresheet = ss.getSheetByName(sheets[0]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[1]: 
     centresheet = ss.getSheetByName(sheets[1]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[2]: 
     centresheet = ss.getSheetByName(sheets[2]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[3]: 
     centresheet = ss.getSheetByName(sheets[3]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[4]: 
     centresheet = ss.getSheetByName(sheets[4]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[5]: 
     centresheet = ss.getSheetByName(sheets[5]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
     } 
    break; 
    } 
} 
} 

답변

1

여기서 중요한 문제는 스크립트가 각 반복마다 값을 가져오고 설정한다는 것입니다. 대신 전체 범위를 가져 와서 계산 한 다음 범위를 업데이트하여 실행 시간을 줄일 수 있습니다. Developers 사이트의 similar example입니다.

+0

많은 양의 데이터라도 시간 트리거를 사용하여 청크로 처리하고 현재 상태를 scriptProperties에 저장하도록 스크립트를 다시 작성해야 할 수도 있습니다. –

+0

사용할 수있는 예가 있습니까? JavaScript에서는 매우 드물게 코드를 작성하므로 불쌍한 코드 = /. – Andy

+0

@Chris는 읽기/쓰기 일괄 처리로 해결할 수 있습니다. 또한 스프레드 시트를 개체로 읽거나 쓰는 방법에 대한 자습서가 https://developers.google.com/apps-script/guides/sheets에 있습니다. 스크립트 청킹이 여전히 필요한 경우 http://patt0.blogspot.in/2014/01/using-scriptapp-to-process-batches-in.html – mhawksey