考えられる原因
・Google側で、計算リソースのバランス調整により、処理速度を落とされた可能性
・既存シートへの追記/更新が繰り返されたことにより、データの読み書きに、なんらかのボトルネックが発生している可能性
解決案
1.
・同じデータを別のファイルで新規作成し直すと、速度が改善する可能性はあります。(Issue Tracker参照)
2.batchUpdate を利用する。
2018年のベンチマークによると、10列・3万行を書き込むテストで、batchUpdate による書き込みは、setValues よりも4~5倍速いようです。
下記は、コピー元シートのA1列を左上とする10000行、100列分のデータを、同じスプレッドシートの別のシートのA1列を左上とする範囲にペーストする例です。
js
1function myFunction2() {
2 var row1 = 1; // コピー元開始行
3 const col1 = 1; // コピー元開始列
4 const row2 = 100000; // コピーする行数
5 const col2 = 100; // コピーする列数
6 const sheetSource = 'コピー元シート名';
7 const sheetDestination = 'コピー先シート名';
8 console.log({numrows:row2, numcols:col2} );
9 const rng = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetSource).getRange(row1,col1,row2,col2);
10 const valuesToSet = rng.getValues();
11 // コピー元と同じ位置にペーストすると仮定。変更したい場合はrow1,col1を変更する。
12 const rng2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetDestination).getRange(row1,col1,row2,col2);
13
14 const request = {
15 'valueInputOption': 'USER_ENTERED',
16 'data': [
17 {
18 'range': `'${sheetDestination}'!${rng2.getA1Notation()}`,
19 'majorDimension': 'ROWS',
20 'values': valuesToSet
21 }
22 ]
23 };
24 Sheets.Spreadsheets.Values.batchUpdate(request, SpreadsheetApp.getActiveSpreadsheet().getId());
25 console.log('コピー完了');
26}
参考: https://stackoverflow.com/questions/64977032/google-apps-script-setvalues-issue-timing-out-intermittently
3.速度の改善はあきらめて、制限時間内におさまるよう、処理を分割する。
→これについては「GAS 時間制限 分割」等で検索するとやり方は出てきます。