adsense自動レスポンシブ

Event

Google Apps Script 実践メモ - onEdit()で複数セルを編集された場合の処理

投稿日:

Google Apps Script(以下GAS)で、セルが編集された場合のイベントを拾って処理を記述することができます。

そのような場合に使用するfunction onEdit(e){}の基本については、こちらの記事「Google Apps Script - onEdit()の基本」にまとめてあるので、ぜひご参照ください。

今回は、実践編シリーズということで、複数セルをコピペなどで同時に編集された場合にどう処理するかを書きたいとおもいます。

 

何にも考えない基本の書き方


一見すると問題なさそうに思えますが、上記のように、単純にe.range.getValue()と書くだけでは、複数セルが編集された場合に左上のセルだけしか認識ず動作がおかしくなります。

例えば、左上のセルが100未満の数字で、それ以外のセルが100以上の場合、それらをコピペしてもIF文を通らず結果として何も起きません。

また、逆に、左上のセルが100以上の数字の場合は、そのIF文判定に引っ張られて、コピペされた複数のセルがすべて赤色になります。

 

複数セルが同時に編集されても対応できる書き方

よほど限定的なシーンでない限り、ユーザが複数セルを同時に編集してくる可能性は常にあるので、それを想定したコードにしておく必要があります。

ではまず、複数セルが編集された場合に、RANGEに複数セルを引っ張ってきていることをonEdit(e)内で確認してみましょう。

ある意味そのまんまですがw、それがわかるとあとは特別な考え方は不要です。

どういう処理をするかにもよりますが、例えば、ある値以上ならセルに色をつけるなど、その値だけを見て処理する場合は、以下のような書き方でよいかとおもいます。

一方で、どの列が編集されたかで処理を分ける必要がある場合は、その列を特定しにいく必要があります。

前述の「何も考えない基本の書き方」で書いた通り、複数セルの左上のセルだけしか認識されない仕様を逆に利用して、以下のように書きます。

 

注意点

ここまであえて触れませんでしたが、e.oldValuee.valueなどはどうなるのでしょうか?

答えは、"undefined"が返ってくる、です。
つまりは、複数セルが編集された場合、編集前の値については諦めるしかないです。。

であればやはり、最初から複数セルの編集も想定して、e.range.getValues()で処理を考えた方がいいかもしれませんね。

以上です!

レクタングル336

レクタングル336

-Event

Copyright© JJ BLOG , 2019 All Rights Reserved.