function pasteDataToMatchingDate55() {
console.time('全体実行時間');
pasteDataToMatchingDateHelper("シート1", "W5", 9, 7, 9);
pasteDataToMatchingDateHelper("シート1", "AL5", 24, 7, 24);
pasteDataToMatchingDateHelper("シート1", "BP5", 54, 7, 54);
pasteDataToMatchingDateHelper("シート1", "CE5", 69, 7, 69);
pasteDataToMatchingDateHelper("シート1", "DI5", 99, 7, 99);
console.timeEnd('全体実行時間');
}
function pasteDataToMatchingDateHelper(sheetName, dateCellRef, startCol, startRow, targetCol) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName(sheetName);
var sourceRange = sourceSheet.getRange(startRow, startCol, 1, 15);
var dateCell = sourceSheet.getRange(dateCellRef);
var dateValue = dateCell.getValue();
var targetSheet = ss.getActiveSheet();
var targetRange = targetSheet.getRange("G12:G");
var targetValues = targetRange.getValues();
var targetDates = targetValues.flat();
console.log(`データ領域 = ${targetSheet.getDataRange().getA1Notation()}`);
console.log(`sourceRange = ${sourceRange.getA1Notation()} : dateCell = ${dateCell.getA1Notation()} : targetDates = ${targetDates.length}`);
console.time('日付検索時間');
var matchingIndex = targetDates.findIndex(function(date) {
return date instanceof Date && date.getTime() == dateValue.getTime();
});
console.timeEnd('日付検索時間');
console.time('データコピー時間');
if (matchingIndex >= 0) {
var matchingRow = matchingIndex + 12;
var sourceValues = sourceRange.getValues()[0];
var targetRowRange = targetSheet.getRange(matchingRow, targetCol, 1, sourceValues.length);
targetRowRange.setValues([sourceValues]);
}
console.timeEnd('データコピー時間');
}
こちらを実行したらどのようなログが出力されますか?
当方で適当にシート(行は1001行、列はDIまで、1001行目は12行目~1000行目の合計行)を作成し、上記のコードを動作させたところ
お知らせ 実行開始
情報 データ領域 = A1:DI1001
情報 sourceRange = I7:W7 : dateCell = W5 : targetDates = 990
デバッグ 日付検索時間: 3ms
デバッグ データコピー時間: 118ms
デバッグ 単体実行時間: 1104ms
情報 データ領域 = A1:DI1001
情報 sourceRange = X7:AL7 : dateCell = AL5 : targetDates = 990
デバッグ 日付検索時間: 2ms
デバッグ データコピー時間: 139ms
デバッグ 単体実行時間: 1110ms
情報 データ領域 = A1:DI1001
情報 sourceRange = BB7:BP7 : dateCell = BP5 : targetDates = 990
デバッグ 日付検索時間: 1ms
デバッグ データコピー時間: 100ms
デバッグ 単体実行時間: 1299ms
情報 データ領域 = A1:DI1001
情報 sourceRange = BQ7:CE7 : dateCell = CE5 : targetDates = 990
デバッグ 日付検索時間: 2ms
デバッグ データコピー時間: 102ms
デバッグ 単体実行時間: 970ms
情報 データ領域 = A1:DI1001
情報 sourceRange = CU7:DI7 : dateCell = DI5 : targetDates = 990
デバッグ 日付検索時間: 1ms
デバッグ データコピー時間: 64ms
デバッグ 単体実行時間: 839ms
デバッグ 全体実行時間: 5335ms
お知らせ 実行完了
といった感じで
pasteDataToMatchingDateHelperの単体での実行時間は大体800ms~1300ms、処理全体で約5500msといった感じになっています。
シートが2000行の場合は
var targetRange = targetSheet.getRange("G12:G");
このデータ取得に時間がかかるみたいでpasteDataToMatchingDateHelperの単体での実行時間は2500msくらいになりました。
追記
G12:Gに関しては一定でコード内でも変化しないみたいですし、下記のように開始時に1回取得して関数に引数としてデータを渡すようにしてはどうでしょうか?
JaveScript
1 function pasteDataToMatchingDate55() {
2 var ss = SpreadsheetApp.getActiveSpreadsheet();
3 var targetSheet = ss.getActiveSheet();
4 var targetRange = targetSheet.getRange("G12:G");
5 var targetValues = targetRange.getValues();
6 var targetDates = targetValues.flat();
7
8 pasteDataToMatchingDateHelper("シート1", "W5", 9, 7, 9, targetSheet, targetDates);
9 pasteDataToMatchingDateHelper("シート1", "AL5", 24, 7, 24, targetSheet, targetDates);
10 pasteDataToMatchingDateHelper("シート1", "BP5", 54, 7, 54, targetSheet, targetDates);
11 pasteDataToMatchingDateHelper("シート1", "CE5", 69, 7, 69, targetSheet, targetDates);
12 pasteDataToMatchingDateHelper("シート1", "DI5", 99, 7, 99, targetSheet, targetDates);
13
14 }
15
16 function pasteDataToMatchingDateHelper(sheetName, dateCellRef, startCol, startRow, targetCol, targetSheet, targetDates) {
17 var ss = SpreadsheetApp.getActiveSpreadsheet();
18 var sourceSheet = ss.getSheetByName(sheetName);
19 var sourceRange = sourceSheet.getRange(startRow, startCol, 1, 15);
20 var dateCell = sourceSheet.getRange(dateCellRef);
21 var dateValue = dateCell.getValue();
22
23 var matchingIndex = targetDates.findIndex(function(date) {
24 return date instanceof Date && date.getTime() == dateValue.getTime();
25 });
26