はじめに

どうも、きいちろーです。

今回は SpreadSheet の GAS を使った仕事を受けた際にはまってしまったことを書こうと思います。

それは、onEdit のトリガーの関数で起きました。

onEdit というのはセルに何か書き込んだことをきっかけにプログラムが起動してくれる便利なものですが、今回は書いたものが即座に別ものに上書きされるという現象があったのでその原因を突き止めて解決したお話です。

原因は、トリガー が2つあったからだったんです。

問題点

今回は依頼主から、日付を入れるとIDと作成日と更新日が自動で作成されるようにしたい、という要望でした。

A列の date に日付を入れると、

H列からJ列までの update_date と id と create_date が自動で入力されるというイメージです。

オートフィルなどで連続で日付を入れると、

このように連続で入れることも可能です。

これは onEdit という名前で関数を作成するとできるようになります。

function onEdit(… と記載されてある関数がそれです。

この関数が書かれた SpreadSheet ファイルのセルに何か書き込んだり編集したりすると onEdit の関数が動き、先ほどのようなことになるというわけです。

これで一度依頼主に納品したところ、後日「IDが重複してしまう」という不具合の連絡が入りました。

私がテストしたときには見抜けなかったのですが、やってみるとIDが重複してしまうことを確認しました。

原因

原因を探るべく、Webで検索したりいろいろ試したりしたところ、実行数 の結果で不思議なことがあることに気づきました。

トリガーが2つ、ほぼ同一時刻で動いていたのです。

ひとつはただのトリガーで、もうひとつはシンプルなトリガーでした。

私はこれを GAS の仕様だと思いこんで気にも留めませんでしたが、よくよく考えると2つのプログラムが同時に動いたらIDの重複も起こり得ると思い、調べました。

すると、トリガーはインストーラブルトリガーのことでした。

どういうことかというと、プログラムで書いたトリガーは「シンプルなトリガー」のことで、これとは別のトリガーが onEdit を実行していたということだったんです。

それがこの トリガー のメニューの中にあるトリガー、つまりインストーラブルトリガーです。

このトリガーでは「スプレッドシートから編集時」に onEdit 関数を実行するように設定されてしまっています。

つまり、これにより意図せずプログラムが重複して動いてしまったというわけです。

こちらを削除したところ問題は解消しました。

さいごに

今回は初歩的なミスではありましたが、onEdit で動きが怪しいと思った時はインストーラブルトリガーを調べることも大事だと思いました。

思い込みの中に原因があるということを学びました。