質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

2751閲覧

GAS setValues の処理時間が5倍以上になったのは何が原因でしょうか?

CodeQuality

総合スコア5

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/04/10 00:52

編集2022/04/10 01:04

1日1回約100万件の2次元配列データをGASでシートに書き込んでいます。
setValuesの呼び出しは1回だけです。
書き込む先は同じシートの同じ位置です。
過去1週間は毎日約4分で処理が終わっていたのですが、昨日は6分のタイムアウトになって、書き込まれた件数が20万件から30万件なので、処理時間が5倍以上になっていました。時間をおいて5回以上試したのですが、結果は変わらずです。
何が原因でしょうか?

補足です。書き込むデータが文字型よりも数字型のほうが処理が数倍早いと感じています。データは全て数字型で、文字型になったということはありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2022/04/10 04:10

スプレッドシートは、毎回新規作成ですか? それとも前回のファイルに値を上書きでしょうか。
CodeQuality

2022/04/10 11:53

同じスプレッドシートの同じシートに上書きしています。 新規作成するとアクセス権の認証が出てしまうので同じスプレッドシートにしています。
guest

回答3

0

同じシートに 値を上書きしているということですので...

ヘルプのファイルの変更内容を確認する 等をみると Google スプレッドシートは過去の変更履歴を保存しているようですので、考えられる原因としては「変更履歴の保存に時間がかかっている」可能性がありそうです。

新規ファイルに対して試してみて時間短縮するのであれば、これが原因の可能性が高いと思われます。

対策ですが、変更履歴の削除や履歴を保存しない設定は確認した範囲ではできないようですので、毎回新規ファイルを作成するように変更するしか無いかもしれません。

投稿2022/04/10 12:45

編集2022/04/10 12:51
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CodeQuality

2022/04/10 13:11

ご回答ありがとうございます。今回は新規ファイルにしても速度はそのままだったのですが、このような原因が考えられることは思いつきませんでした。どうもありがとうございました。
guest

0

ベストアンサー

考えられる原因

・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 時間制限 分割」等で検索するとやり方は出てきます。

投稿2022/04/10 03:15

編集2022/04/10 06:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CodeQuality

2022/04/10 13:35

何度も様々な考察をいただきどうもありがとうございます。最終的には batchUpdate を使用することで、20秒で処理が終わりました。さらによい方法がみつかりありがとうございました。
退会済みユーザー

退会済みユーザー

2022/04/10 13:36

解決してよかったです。
guest

0

実は、同一スプレッドシートにシートを追加していました。
スプレッドシート内のシート数を元に戻したら実行速度が元に戻りました。
さらに良い解決策をご教授いただきありがとうございました。

投稿2022/04/10 13:39

CodeQuality

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問