あるプログラムで以下のようなコードを1→2の順番で実行していますが
パフォーマンスがかなり落ちてしまうとの指摘がありました。
そこでこのコードのパフォーマンスを向上させようと思うのですが
見ただけではどのコードを直していけば分からないという所に
なってしまいました。
どのように修正すればパフォーマンスを上げることが出来ますでしょうか。
環境:Google スプレッドシートのスクリプト
1var SET_VIEW_ID ='202095345'; 2var SHEET_NAME_PV = 'PV'; 3 4// 1番目に動くコード 5function myFunction1() { 6 var spreadsheet = SpreadsheetApp.getActive(); 7 copyCheck(spreadsheet); 8 9 var sh = spreadsheet.getSheetByName(SHEET_NAME_PV); 10 spreadsheet.setActiveSheet(sh, true); 11 spreadsheet.getRange('B6').activate(); 12 spreadsheet.getRange('Title!A16:A1171').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 13 deleteDeduplicateTitle(sh); 14}; 15 16// 2番目に動くコード 17function myFunction2() { 18 var spreadsheet = SpreadsheetApp.getActive(); 19 var sh = spreadsheet.getSheetByName(SHEET_NAME_PV); 20 sh.getFilter().sort(4, false); 21}; 22 23// 1番目の中で追加で動くコード 24function deleteDeduplicateTitle(sh) { 25 sh.getColumnGroup(4, 1).expand(); 26 var data = sh.getRange("E7:E").getValues(); 27 28 for(i=0; i<500; i++) { 29 var deduplication = data[i]; 30 if( 1 <= deduplication ) { 31 sh.getRange(i+7, 2).setValue(''); 32 } 33 } 34 35 sh.getColumnGroup(4, 1).collapse(); 36};
まずどこがボトルネックになっているのか処理時間を計測してください。
以下のコードを使って時間計測を行った結果以下のような結果となりました。
function logTime() {
const label = 'speedTest time'
console.time(label);
myFunction1();
myFunction2();
console.timeEnd(label);
}
16:17:32 お知らせ 実行開始
16:17:43 デバッグ
speedTest time: 10811ms
16:17:43 お知らせ 実行完了
一か所抜けていたコードがありましたのでそこも追加しました。
時間計測のスパンが大きすぎて意味がありません。myFunction1内の各処理にかかっている時間を計測しなければチューニングするべき箇所の特定も出来ません。
機能1で分割して実行時間を記録するようにしてみました。
function myFunction1() {
var spreadsheet = SpreadsheetApp.getActive();
const label = 'speedTest time';
console.time(label);
var sh = spreadsheet.getSheetByName(SHEET_NAME_PV);
spreadsheet.setActiveSheet(sh, true);
spreadsheet.getRange('B6').activate();
spreadsheet.getRange('Title!A16:A1171').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
console.timeEnd(label);
console.time(label);
deleteDeduplicateTitle(sh);
console.timeEnd(label);
};
実行結果は以下の通りとなりました。
18:52:38 お知らせ 実行開始
18:52:38 デバッグ speedTest1(シート選択) time: 356ms
18:52:43 デバッグ speedTest2(重複削除) time: 4755ms
18:52:44 お知らせ 実行完了
重複削除のところが時間がかかっている感じがします。
あなたの回答
tips
プレビュー