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

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

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

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

Q&A

解決済

2回答

2594閲覧

もともと1秒かそこらで完了していたスクリプトが、なぜか完了までに90秒ぐらいかかるようになりました。

koromo_t

総合スコア60

Google Apps Script

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

1グッド

1クリップ

投稿2018/05/21 17:02

編集2018/05/22 04:34

こちらの質問にて、関数のパラメータを取得し、
それを利用するスクリプトを書くことに成功しました。

そのことが関係あるのかどうかわからないのですが、
もともと1秒かそこらで完了していたこのスクリプトが、
なぜか完了までに90秒ぐらいかかるようになりました。

特に思い当たる節がないのですが、なにかあるのだと思います。
そこで、詳しい方なら、コードとログを見れば、
ボトルネックを見つけていただくことができるのではないかと考え、この記事を投稿します。
丸投げと言われるかもしれないとも思いましたが、本当に原因がわからないのです。
丸投げのつもりはないと明記しておきます。

以下、コードと実行トランスクリプトです。
実行トランスクリプトを見ると、「getLastRow()」「getValue()」が実行されたとき、
やたらと時間を食っている、というところまでは分析できました。

javaScript

1function zenbu(e){ 2 var sheetName = e.source.getSheetName(); 3 Logger.log(sheetName); 4 // 生ログに変更のあったときのみ動かす 5 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 6 var sheet_nama = spreadsheet.getSheetByName('生ログ'); 7 var sheet_henkou = spreadsheet.getActiveSheet().getSheetName(); 8 Logger.log(sheet_henkou); 9 var lastRow_nama = sheet_nama.getLastRow(); 10 var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue(); 11 Logger.log(tweet_nama); 12 if((sheetName=="生ログ")&&(tweet_nama.match(/.*を読んでいる本に追加.*/))){ 13 seikei(); 14 } 15 time(); 16} 17 18function seikei() { 19 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 20 var sheet_nama = spreadsheet.getSheetByName('生ログ'); 21 var sheet = spreadsheet.getSheetByName('読書リスト'); 22 var sheet_memo = spreadsheet.getSheetByName('メモ'); 23 var lastRow_nama = sheet_nama.getLastRow(); 24 var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue(); 25 // タイトルと著者部分 26 var reg3 = "【(.*)】"; 27 var title_hissya_nama = sheet_nama.getRange(lastRow_nama,2).getValue().match(reg3)[1]; 28 Logger.log(title_hissya_nama); 29 // タイトルの抽出 30 var lastRow = sheet.getLastRow(); 31 var title = sheet.getRange(lastRow+1,2); 32 var reg = "^(.*?)/"; 33 if(title_hissya_nama.match(reg)){ 34 var title_nama = title_hissya_nama.match(reg)[1]; 35 Logger.log(title_nama); 36 title.setValue(title_nama); 37 } 38 else{ 39 title.setValue(title_hissya_nama); 40 } 41 // 著者の抽出 42 var hissya = sheet.getRange(lastRow+1,3); 43 var reg2 = "/(.*?)$"; 44 if(title_hissya_nama.match(reg2)){ 45 var hissya_nama = title_hissya_nama.match(reg2)[1]; 46 Logger.log(hissya_nama); 47 hissya.setValue(hissya_nama); 48 } 49 else{ 50 hissya.setValue(""); 51 } 52 // 冊数を記入 53 var lastRow_val = sheet.getRange(lastRow,1).getValue(); 54 Logger.log(lastRow_val); 55 var count = sheet.getRange(lastRow+1,1); 56 count.setValue(lastRow_val+1); 57 // Googleカレンダー用成形 58 var google = sheet.getRange(lastRow+1,11); 59 if((hissya_nama!=" ")&&(title_hissya_nama.match(///))){ 60 google.setValue(title_nama + " / " + hissya_nama + "【読書メモ】"); 61 } 62 else{ 63 google.setValue(title_nama + "【読書メモ】"); 64 } 65 // 出版社 66 var pub = sheet.getRange(lastRow+1,4); 67 pub.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,3,)"); 68 // 出版日時 69 var pub_day = sheet.getRange(lastRow+1,5); 70 pub_day.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,4,)") 71 // ページ数 72 var page = sheet.getRange(lastRow+1,9); 73 page.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,5,)") 74} 75 76function time() { 77 // かかった時間 78 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 79 var sheet = spreadsheet.getSheetByName('読書リスト'); 80 var lastRow = sheet.getLastRow(); 81 var time = sheet.getRange(lastRow,8); 82 if(sheet.getRange(lastRow,7).getValue() != ""){ 83 var time_start = new Date(sheet.getRange(lastRow,6).getValue()); 84 Logger.log(time_start); 85 var time_end = new Date(sheet.getRange(lastRow,7).getValue()); 86 Logger.log(time_end); 87 var time_diff = ((time_end-time_start)/(1000*60*60*24)); 88 Logger.log(time_diff); 89 time.setValue(time_diff); 90 // 1日あたり 91 var by1day = sheet.getRange(lastRow,10); 92 var page = sheet.getRange(lastRow,9).getValue(); 93 by1day.setValue(page/time_diff); 94 } 95}
[18-05-21 09:36:50:491 PDT] Session.getActiveUser() [0 秒] [18-05-21 09:36:50:491 PDT] User.getEmail() [0 秒] [18-05-21 09:36:50:491 PDT] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [18-05-21 09:36:50:501 PDT] 実行を開始しています [18-05-21 09:36:50:508 PDT] SpreadsheetApp.getActiveSheet() [0 秒] [18-05-21 09:36:50:690 PDT] Spreadsheet.getSheetName() [0.081 秒] [18-05-21 09:36:50:691 PDT] Logger.log([生ログ, []]) [0 秒] [18-05-21 09:36:50:692 PDT] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [18-05-21 09:36:50:692 PDT] Spreadsheet.getSheetByName([生ログ]) [0 秒] [18-05-21 09:36:50:693 PDT] Spreadsheet.getActiveSheet() [0 秒] [18-05-21 09:36:50:693 PDT] Sheet.getSheetName() [0 秒] [18-05-21 09:36:50:693 PDT] Logger.log([生ログ, []]) [0 秒] [18-05-21 09:37:00:292 PDT] Sheet.getLastRow() [9.598 秒] [18-05-21 09:37:00:293 PDT] Sheet.getRange([21, 2]) [0 秒] [18-05-21 09:37:10:402 PDT] Range.getValue() [10.108 秒] [18-05-21 09:37:10:402 PDT] Logger.log([【〆切本/夏目漱石他】を読んでいる本に追加 → https://t.co/EGYIJFogC4 #bookmeter, []]) [0 秒] [18-05-21 09:37:10:403 PDT] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [18-05-21 09:37:10:404 PDT] Spreadsheet.getSheetByName([生ログ]) [0 秒] [18-05-21 09:37:10:404 PDT] Spreadsheet.getSheetByName([読書リスト]) [0 秒] [18-05-21 09:37:10:405 PDT] Spreadsheet.getSheetByName([メモ]) [0 秒] [18-05-21 09:37:20:533 PDT] Sheet.getLastRow() [10.127 秒] [18-05-21 09:37:20:533 PDT] Sheet.getRange([21, 2]) [0 秒] [18-05-21 09:37:20:534 PDT] Range.getValue() [0 秒] [18-05-21 09:37:20:534 PDT] Sheet.getRange([21, 2]) [0 秒] [18-05-21 09:37:20:535 PDT] Range.getValue() [0 秒] [18-05-21 09:37:20:535 PDT] Logger.log([〆切本/夏目漱石他, []]) [0 秒] [18-05-21 09:37:31:106 PDT] Sheet.getLastRow() [10.57 秒] [18-05-21 09:37:31:107 PDT] Sheet.getRange([12, 2]) [0 秒] [18-05-21 09:37:31:108 PDT] Logger.log([〆切本, []]) [0 秒] [18-05-21 09:37:31:109 PDT] Range.setValue([〆切本]) [0 秒] [18-05-21 09:37:31:112 PDT] Sheet.getRange([12, 3]) [0.003 秒] [18-05-21 09:37:31:113 PDT] Logger.log([夏目漱石他, []]) [0 秒] [18-05-21 09:37:31:114 PDT] Range.setValue([夏目漱石他]) [0 秒] [18-05-21 09:37:31:115 PDT] Sheet.getRange([11, 1]) [0 秒] [18-05-21 09:37:51:348 PDT] Range.getValue() [20.232 秒] [18-05-21 09:37:51:348 PDT] Logger.log([9.0, []]) [0 秒] [18-05-21 09:37:51:349 PDT] Sheet.getRange([12, 1]) [0 秒] [18-05-21 09:37:51:349 PDT] Range.setValue([10.0]) [0 秒] [18-05-21 09:37:51:350 PDT] Sheet.getRange([12, 11]) [0 秒] [18-05-21 09:37:51:351 PDT] Range.setValue([〆切本 / 夏目漱石他【読書メモ】]) [0 秒] [18-05-21 09:37:51:351 PDT] Sheet.getRange([12, 4]) [0 秒] [18-05-21 09:37:51:352 PDT] Range.setFormula([=VLOOKUP(B12,'メモ'!B:F,3,)]) [0 秒] [18-05-21 09:37:51:353 PDT] Sheet.getRange([12, 5]) [0 秒] [18-05-21 09:37:51:353 PDT] Range.setFormula([=VLOOKUP(B12,'メモ'!B:F,4,)]) [0 秒] [18-05-21 09:37:51:354 PDT] Sheet.getRange([12, 9]) [0 秒] [18-05-21 09:37:51:355 PDT] Range.setFormula([=VLOOKUP(B12,'メモ'!B:F,5,)]) [0 秒] [18-05-21 09:37:51:355 PDT] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [18-05-21 09:37:51:356 PDT] Spreadsheet.getSheetByName([読書リスト]) [0 秒] [18-05-21 09:38:11:539 PDT] Sheet.getLastRow() [20.182 秒] [18-05-21 09:38:11:539 PDT] Sheet.getRange([12, 8]) [0 秒] [18-05-21 09:38:11:540 PDT] Sheet.getRange([12, 7]) [0 秒] [18-05-21 09:38:21:667 PDT] Range.getValue() [10.126 秒] [18-05-21 09:38:21:669 PDT] 実行が無事終了しました(合計ランタイム 91.06 秒)

自己解決(2018/05/22 13:32)

寝て起きて再びスクリプトを動かしたところ、また1秒程度で動くようになっていました。
解決策「放置」というケースもあるのですね。
それはそれで謎ですが、でもまた「まとも」な範囲の速度で動いてくれるようになったので、
この質問は解決済みとすることにします。お騒がせして申し訳ありません。

set0gut1👍を押しています

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

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

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

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

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

guest

回答2

0

解決済み、過去1年ぐらいまでのteratail内での同様の質問です。

上記以前のものを含めると、もっと多いです。
外部サイトでも同様の情報は簡単に入手できます。
これらの情報に触れた、少なくとも参考にして試行錯誤したという経緯が読み取れなければ、「丸投げ」と捉えられても仕方がないですよ。
(koromo_tさん個人を非難、攻撃しているわけではないです)

投稿2018/05/21 23:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

koromo_t

2018/05/22 04:35

回答ありがとうございます! んー…、もともとは1秒程度で完了していたのに、 パラメータを利用したとたんに90秒までかかるようになったのはなぜか、 そういうことはあるのか、ということが知りたかったのですが…。 スクリプトの書き方は冗長かもしれませんが、それでも1秒程度で完了していたのです。 それが90秒もかかるようになったことは、 書き方が冗長以上の原因が考えられると思いませんか。 少なくとも私はそう思ったので、質問を投稿した次第です。 ……と思ったのですが、寝て起きて再びスクリプトを動かしたところ、 また1秒程度で動くようになっていました。 解決策「放置」というケースもあるのですね。 それはそれで謎ですが、でもまた「まとも」な範囲の速度で動いてくれるようになったので、 この質問は解決済みとすることにします。お騒がせして申し訳ありません。 せっかくいただいたので、スクリプトの簡潔化については考えてみたいと思います。 ありがとうございました。
guest

0

自己解決

自己解決(2018/05/22 13:32)

寝て起きて再びスクリプトを動かしたところ、また1秒程度で動くようになっていました。
解決策「放置」というケースもあるのですね。
それはそれで謎ですが、でもまた「まとも」な範囲の速度で動いてくれるようになったので、
この質問は解決済みとすることにします。お騒がせして申し訳ありません。

投稿2018/05/22 04:35

koromo_t

総合スコア60

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

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

退会済みユーザー

退会済みユーザー

2018/05/22 07:02

特定のクラスやメソッドで、時折、今回のように処理遅延が生じるケースはありえます。 GASは便利ではありますが、不安定な部分もあります。 この点について、下記にてunauさんが問題提起されていますので参考情報としてあげておきますね。 [参考] 「業務アプリで GAS (Google Apps Script) を使い続けていて大丈夫なのでしょうか」https://teratail.com/questions/89719
koromo_t

2018/05/22 08:25 編集

参考情報ありがとうございます! 不安定な部分があることも頭に入れて、使っていきたいと思います。 今後、万が一、想定外の遅延が起きても、慌てず騒がず、 とりあえず放置して経過観察してみるのもひとつの手であることを学習しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問