Javascript/GAS에 익숙하지 않아 GAS 문제로 다시 돌아 왔습니다. 효율적인 방법으로 함수 호출을 처리하는 방법에 따라 스크립트가 얼마나 느리게 실행되는지에 대한 약간의 문제가 있습니다.Google Apps Script 스프레드 시트 범위 처리 (Get-Process-Set; 작동하지 않음)
나는 일을이 "읽기 모두"다음 "쓰기 모든"- 분석 - 설정을 점점 (스프레드 시트 적어도) 값에 대한 것을, 여러 곳 (아, 그것은 here이었다)에 읽었습니다을 "get-one, write-one"방법보다 더 빨리 수행하십시오 (분명한 이유가 있습니다).
는 전 범위의 모든 값을 얻는 방법을 알고 있지만 나는 (다차원) 배열, 데이터를 처리를 통해 이동하고 그에 따라 새로운 범위을 설정하는 방법을 정말 모르겠어요.문제 :이 기능은 시작하는 데 약 2 초 정도 걸립니다, 50 개 행을 실행하는 데 약 5 초 정도 걸립니다. 문제는이 스프레드 시트에 수천 개의 행이있을 가능성이 있으며이 기능을 실행하려면 데이터가 올바르게 처리되어 부메랑 캘린더가 시간 데이터를 올바르게 선택한다는 것입니다. 내 생각에 말도 안되는 말입니다. 이 스크립트는 처리해야하는 모든 데이터 열에 대해 두 배의 시간이 소요됩니다. 이는 끔찍한 일입니다. 나는 다음 학기 중에 나는 종종 "GAS 처리 시간 제한"을 지킬 것을 두려워합니다.
function fixApostrophes() {
// Get the active spreadsheet to run the script on
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Get the active sheet within the document to run the script on
var sheet = spreadsheet.getActiveSheet();
// Get max number of rows needed to process
var maxRows = sheet.getLastRow();
// Get the range for the startTime column and endTime column
var apostropheRange = sheet.getRange(1, 10, maxRows, 2);
// Get the value in each cell, remove apostrophes from the start,
// and replace the value in that cell
for (var i = 1; i < apostropheRange.getNumRows(); ++i) {
// Get the cells for startTime and endTime to speed things up a bit
var startCell = apostropheRange.getCell(i, 1);
var endCell = apostropheRange.getCell(i, 2);
// Get the values for startTime and endTime
var startTime = startCell.getValue();
var endTime = endCell.getValue();
// Remove apostrophes from start of startTime
while(startTime.charAt(0) == "'") {
startTime = startTime.substring(1);
}
// Remove apostrophes from start of startTime
while(endTime.charAt(0) == "'") {
endTime = endTime.substring(1);
}
// Set the values for startTime and endTime
startCell.setValue(startTime);
endCell.setValue(endTime);
}
}
이것은 매우 스케줄링 이벤트 부메랑 달력 기능을 파괴 할 때 한 번 시간 포맷 아포스트로피 문제를 해결에 대한 내 previous question 관련이있다 : 여기
는 시작 코드 (나쁜, 내가 인정)입니다.
용액 다음 Range.getValues()
함수를 이용하여 2 차원 배열 범위에서 값을 당겨. 2D 배열의 각 값을 처리합니다 (행 단위로 처리하는 것이 가장 논리적 인 방법 일 수 있음). 새 값으로 편집 된 값의 인덱스를 업데이트합니다 (코드의 Srik-answer 주석 참조). 그런 다음 Range.setValues(2Darray)
을 사용하여 2D 배열의 요소를 원래 범위로 되돌립니다. 네가 그걸 보았 으면 너에게 도움이되기를 바란다! 이는 원래 코드 에서처럼 API를 여러 번 호출하는 것보다 훨씬 더 빠르게 입니다.
function myNewLibraryFunction(startCol, numColumns) {
// Get the active spreadsheet to run the script on
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Get the active sheet within the document to run the script on
var sheet = spreadsheet.getActiveSheet();
// Get max number of rows needed to process
var maxRows = sheet.getLastRow();
// Get the range for the startTime column and endTime column
var dataRange = sheet.getRange(1, startCol, maxRows, numColumns);
var values = dataRange.getValues();
// Get the value in each cell, remove apostrophes from the start,
// and replace the value in that cell
for (var i = 1; i < maxRows; ++i) {
// Get the values for startTime and endTime
var startTime = values[i][0];
var endTime = values[i][1];
// Remove apostrophes from start of startTime
while(startTime.charAt(0) == "'") {
startTime = startTime.substring(1);
}
// Remove apostrophes from start of startTime
while(endTime.charAt(0) == "'") {
endTime = endTime.substring(1);
}
values[i][0] = startTime; // New stuff from Srik's answer
values[i][1] = endTime; // New stuff from Srik's answer
}
dataRange.setValues(values);
SpreadsheetApp.flush(); // New stuff from Srik's answer
}
이 솔루션을 넣어 주셔서 감사 볼 수 있습니다. 나는 원거리 값을 얻는 데 몇 가지 문제를 겪어 왔고 이것이 나에게 맞았다. 명성; 완전한 논평을 사랑해! – MrGreggles
@GreggCleland 이것은 처음 GAS로 코드를 작성한 때였습니다. 처음에는 꽤 혼란스러워서 전에는 자바 스크립트로 작업 한 적이 없었기 때문에 모든 전화에서 무슨 일이 일어 났는지 알았는지 확인하고 싶었습니다. P가 도움이된다면 upvote를 자유롭게 사용하십시오;) –