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

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

ただいまの
回答率

90.47%

  • Google Apps Script

    902questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 270

koromo_t

score 50

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

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

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

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

function zenbu(e){
  var sheetName = e.source.getSheetName();
  Logger.log(sheetName);
  // 生ログに変更のあったときのみ動かす
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_nama = spreadsheet.getSheetByName('生ログ');
  var sheet_henkou = spreadsheet.getActiveSheet().getSheetName();
  Logger.log(sheet_henkou); 
  var lastRow_nama = sheet_nama.getLastRow();
  var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue();
  Logger.log(tweet_nama);
  if((sheetName=="生ログ")&&(tweet_nama.match(/.*を読んでいる本に追加.*/))){
  seikei();
  }
  time();
}

function seikei() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_nama = spreadsheet.getSheetByName('生ログ');
  var sheet = spreadsheet.getSheetByName('読書リスト');
  var sheet_memo = spreadsheet.getSheetByName('メモ');  
  var lastRow_nama = sheet_nama.getLastRow();
  var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue();
  // タイトルと著者部分
  var reg3 = "【(.*)】";
  var title_hissya_nama = sheet_nama.getRange(lastRow_nama,2).getValue().match(reg3)[1];
  Logger.log(title_hissya_nama);
  // タイトルの抽出
  var lastRow = sheet.getLastRow();
  var title = sheet.getRange(lastRow+1,2);
  var reg = "^(.*?)\/";
  if(title_hissya_nama.match(reg)){
  var title_nama = title_hissya_nama.match(reg)[1];
  Logger.log(title_nama);
  title.setValue(title_nama);
  }
  else{
  title.setValue(title_hissya_nama);
  }
  // 著者の抽出
  var hissya = sheet.getRange(lastRow+1,3);
  var reg2 = "\/(.*?)$";
  if(title_hissya_nama.match(reg2)){
  var hissya_nama = title_hissya_nama.match(reg2)[1];
  Logger.log(hissya_nama);
  hissya.setValue(hissya_nama);
  }
  else{
  hissya.setValue("");
  }
  // 冊数を記入
  var lastRow_val = sheet.getRange(lastRow,1).getValue();
  Logger.log(lastRow_val);
  var count = sheet.getRange(lastRow+1,1);
  count.setValue(lastRow_val+1);
  // Googleカレンダー用成形
  var google = sheet.getRange(lastRow+1,11);
  if((hissya_nama!=" ")&&(title_hissya_nama.match(/\//))){
  google.setValue(title_nama + " / " + hissya_nama + "【読書メモ】");
  }
  else{
  google.setValue(title_nama + "【読書メモ】");
  }
  // 出版社
  var pub = sheet.getRange(lastRow+1,4);
  pub.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,3,)");  
  // 出版日時
  var pub_day = sheet.getRange(lastRow+1,5);
  pub_day.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,4,)")
  // ページ数
  var page = sheet.getRange(lastRow+1,9);
  page.setFormula("=VLOOKUP(B"+(lastRow+1)+",'メモ'!B:F,5,)")
}

function time() {
  // かかった時間
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('読書リスト');
  var lastRow = sheet.getLastRow();
  var time = sheet.getRange(lastRow,8);
  if(sheet.getRange(lastRow,7).getValue() != ""){
  var time_start = new Date(sheet.getRange(lastRow,6).getValue());
  Logger.log(time_start);   
  var time_end = new Date(sheet.getRange(lastRow,7).getValue());
  Logger.log(time_end);
  var time_diff = ((time_end-time_start)/(1000*60*60*24));
  Logger.log(time_diff);
  time.setValue(time_diff);
  // 1日あたり
  var by1day = sheet.getRange(lastRow,10);
  var page = sheet.getRange(lastRow,9).getValue();
  by1day.setValue(page/time_diff);  
  }
}
[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秒程度で動くようになっていました。
解決策「放置」というケースもあるのですね。
それはそれで謎ですが、でもまた「まとも」な範囲の速度で動いてくれるようになったので、
この質問は解決済みとすることにします。お騒がせして申し訳ありません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/22 13:35

    回答ありがとうございます!
    んー…、もともとは1秒程度で完了していたのに、
    パラメータを利用したとたんに90秒までかかるようになったのはなぜか、
    そういうことはあるのか、ということが知りたかったのですが…。

    スクリプトの書き方は冗長かもしれませんが、それでも1秒程度で完了していたのです。
    それが90秒もかかるようになったことは、
    書き方が冗長以上の原因が考えられると思いませんか。
    少なくとも私はそう思ったので、質問を投稿した次第です。

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

    せっかくいただいたので、スクリプトの簡潔化については考えてみたいと思います。
    ありがとうございました。

    キャンセル

check解決した方法

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/22 16:02

    特定のクラスやメソッドで、時折、今回のように処理遅延が生じるケースはありえます。
    GASは便利ではありますが、不安定な部分もあります。
    この点について、下記にてunauさんが問題提起されていますので参考情報としてあげておきますね。

    [参考]
    「業務アプリで GAS (Google Apps Script) を使い続けていて大丈夫なのでしょうか」https://teratail.com/questions/89719

    キャンセル

  • 2018/05/22 17:23 編集

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    902questions

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