かずきち。の日記

サーバサイドエンジニアのつぶやき

【初心者向け】GASでエラーが出たときにデバッカツールを使って、プログラム中の変数をトレースする方法

スクリプトを書いていると、何行目でどこの変数に何が定義されているのかわからなくなりませんか?

プログラムが100行とか超えてくると、条件分岐、繰り返しが複雑になってきて
どこの変数にどこのタイミングで何が格納されているかわからなくなります。
そしてGoogleにURLのfetch回数が多すぎますとか怒られます。

f:id:kazukichi_0914:20211010150946g:plain
引用:
https://developers.google.com/apps-script/guides/services/quotas

例えば、URL fetch callは無料アカウントの場合1日1000回叩いていいよ!
と実行回数に上限があります。

わかりやすく、説明しましょうか。
焼き肉食べ放題に行ったら、

90分とか上限ありますよね?

昨今は〜〜放題みたいな文言が溢れていますが、厳密には〜〜放題ではないです。

www.youtube.com
引用:
https://www.youtube.com/watch?v=y1BKJjRsLik

そりゃそうですよね?
お皿がなくなったら、食べ放題できませんし
材料がなくなっても、食べ放題はできないです。

一方、コンピュータの世界って比較的〜〜し放題だと思いませんか?

YouTubeはいくら見ても無料だし
Google検索はいくら検索しても無料です。
とは言っても、100億回とかクエリを投げたりするとさすがに怒られます。
今回は特にGoogleAppsScriptで変数のコールスタック方法をお教えします。

コールスタックって何だよ?

複数階層の関数を呼び出したスクリプト内の位置を追跡し続けることです。 — どの関数が現在実行されているのか、その関数の中でどの関数が呼び出されたか、などです。
引用;
https://developer.mozilla.org/ja/docs/Glossary/Call_stack#:~:text=%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%20(call%20stack)%20%E3%81%AF,%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%81%9F%E3%81%8B%E3%80%81%E3%81%AA%E3%81%A9%E3%81%A7%E3%81%99%E3%80%82


わかりやすく説明しましょう。

今回はプログラミングコードを完成されること=料理をしていると考えてください。

f:id:kazukichi_0914:20211010152235g:plain

実行時間の最大時間を超えましたと怒られるわけです。

カップラーメンの湯で時間3分を超えたら、ラーメンが伸びるのでわかるんですが…
プログラミングの場合、なんで怒られているのかさっぱるわかりません。

そのためにデバッガツールを使かおう!

デバッガツールはコンソール画面で「デバック」ボタンを教えて下さい。

f:id:kazukichi_0914:20211010152805g:plain

すると各行ごとに変数をトレースするモードに切り替わって、1行ごとソース内で何が起きているのかがわかります。

f:id:kazukichi_0914:20211010150514g:plain

あるあるの話をすると
例えば文字列型aに12345という文字を代入したとします。
その後にb=a+1
を実行していたら、Typeエラーとか出て「なに?」みたいなことになります。

文字列型に数字足してるけど大丈夫?と気がつくためにデバッガツールは使いましょうということです。

別に自分の目で見て確認すればいいじゃん?
って思いますよね?
10000行のソースコードのバグ取りはほぼ不可能です。
デバッガツールでトレースをしないと…

エクセルVBAでも変数をウォッチしよう

f:id:kazukichi_0914:20211010153902p:plain
引用:
https://www.wanichan.com/pc/excel/2016/8/39.html

エクセルとかはエラーウォッチ機能が充実していて、

「ここ間違えてるけど、この変数・この数式で大丈夫?」

と聞いてきてくれるので、エラーに関するヘルプっていうのを見て修正するだけです。

なんでこんなエラー取り機能が充実してるか?

コンピュータの世界にあるあるですが、ルール変更の回数が多いからです。
ワード・エクセル・パワポなどなど、ルール変更が日常茶飯事で起きるので、

もはやルール覚える意味なくないか?

なので、どちらかというとデバッグツールで出たエラーコードを使って正しくバグ取りをできることが重要です。
基本的にプログラミング系は開発段階ではミスったところで人は死にません。

開発環境→テスト→本番環境リリース

なので、いきなり100%を目指さなくても大丈夫です。
途中で仕様変更もあります。
昨日Googleのルールと次の日Googleのルールが違うことは大いにあります。

f:id:kazukichi_0914:20211010154759g:plain

それはITの世界がGAFAの鶴の一声でいくらでも変わるからです。
なので、どちらかというと現行のルールをよく覚えておくというよりも、プログラマーの人にはルールに柔軟に対応できる素養が求められます。

f:id:kazukichi_0914:20211010155109g:plain

蓮舫Googleさん、ちょっと対応が場当たりすぎるんじゃないですか?」

でもコンピュータの世界は別に場当たり的でも、「いい」と思った方に進む世界なので、いきなり完璧を目指すのではなく、エラーが出たときに修正できる能力が大事です。