⚠注意⚠GAS初心者のただの嘆きと、意味わからん記号の使い方についての備忘録。
昨日予告した通り、本日はGASへの不満を述べていくわけだが、気付いたら備忘録みたいになっていたので、不満兼備忘録と思ってくれてもよいだろう。なんと有用なんだ!素晴らしい!
また、一応、特定セル(A)に特定の値が入ったときだけ特定セル(B)に特定のワードをぶち込む、みたいな単純コードもある(例として)。
ではさっそく、やっぱExcelにはかなわんな、と思う点を個人の主観で述べていこう。
あんま要らないかもしれないが、目次↓
- setVisibleValuesあるのに使えないという意味の分からなさ。
- スクリプト実行時の動作が遅いのに加えて、onEdit(e)で条件指定しても結局スクリプト自体は毎回実行されている。
- ~以下備忘録~
setVisibleValuesあるのに使えないという意味の分からなさ。
setVisibleValuesとはGASでフィルタ操作する際のコード。であるはずなのだ。
setHiddenValuesが〇〇を非表示にするという意味なら、Visibleは〇〇を表示するという、つまり対のコードになる。
例えばフィルタで項目が10ある中から1つだけ表示し、残りは非表示にしたい場合、断然使うならsetVisibleValuesになるが、残念なことに現在使えない。コードとして無いならまだ発展途上なんやな、と諦めもつくってもんだが、そうではなく、存在するのに未サポートというわけだ。
なんで?なんで同時サポート開始しなかったん?マジで理解不能。
スクリプト実行時の動作が遅いのに加えて、onEdit(e)で条件指定しても結局スクリプト自体は毎回実行されている。
たとえば、VBAのSheet1モジュールに、
Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("A1").Address Then
If Range("A1") = 1 Then
Range("B3") = "hoooooo!"
Else
Range("B3").Clear
End If
End If
End Sub
を入れた場合、Sheet1のA1に値が入ったときだけコードは実行されるが、
(つまりは、Sheet1のA1に1が入ったときだけB3にhoooooo!が入り、それ以外の場合はB3は空欄となる)
GASで、
function onEdit(e) {
var sheet = e.source.getActiveSheet();
if (sheet.getName() === 'シート1' && e.range.getA1Notation() === "A1" && e.range.getValue() == 1) {
sheet.getRange("B3").setValue('hoooooo!');
}
else{
sheet.getRange("B3").setValue('');
}
}
/** getA1Notation=A1表記らしい。A1表記ってなんやねん、という話だが、A1表記じゃない場合がR1C1表記、といえば分かるだろう */
※GASコメントアウト記法→/** */ (/**まで入力すると勝手におしりの*/が出てくる)
先のVBAと全く同じ動きになるようにシート1且つセルA1に1が入った時だけ実行されるコードを書いても、
Before↓
After↓
このように、編集判定の条件を指定しているのに、その条件関係無くとりあえず実行されるというアホさ。
恐らく、VBAなら細かくトリガー条件を決められるが、GASの場合、動き始めてから条件分岐するという仕様なのだ。
なので、VBAのように細かい条件ごとではなく、実際には「編集有無」だけをトリガー条件とした結果裏では毎度毎度発動しているっぽい。
もちろん、トリガー後は更にif条件分岐があるため、条件外で誤作動する事は無い。
要は、onEdit(e)自体が条件分岐式みたいなもんで、編集有無判断→次の条件式に移る、と、条件式が二重になってると考えれば分からんでもないし、逆にVBAがすごいのかもしれんが(厳密に条件外では発動せずって、じゃあその条件外かどうかはどうやって判定してんのと)。
ただ、常でさえ重いくせに、この動きするせいで余計に重くなってるんじゃないのか、と思うと、正直気に食わん(あとそのせいか、実行終了せず実行中で残る事もある)。
※VBAでコードが実行されたかされていないかは、Ctrl+Zが効くか効かないかでわかる(スプレッドシートの場合、スクリプト実行後もCtrl+Z効くだけマシか)。
(どうでもいいが、onEdit(e)はonEdit(d)でも動く。代入できればなんでもいい、変数みたいなもんってことなんだろう多分)
その他、VBAならできるのに!!みたいなことが多々ある。まあこれは己の技量の問題かもしれんが。
スプレッドシートの最大のメリット・魅力は、クラウドで共有しながら使えるってことだから、Excelとは完全に用途は異なると考えつつ、
・オフライン環境(社内ネットワーク等)で作業可能ならExcel
・オンラインで遠方者と共有&常に編集が必要ならスプレッドシート
※厳密にはどっちもオンラインだが、いんたーねっつに繋がっていない状態をオフラインと表現している。
と、こんな感じで分けて使用していくしかないな。
【結論】両者ともに互いの代替とは成り得ない。
~以下備忘録~
==と===の違い
==は忖度してくれる。===は文字か数値かまで判別し厳密な比較を行う。
たとえば==なら"1"は1に等しいが、===なら"1"は1と異なるのである。
例文↓
function onEdit(e) {
var acsheet = e.source.getActiveSheet();
var cell = e.source.getActiveRange();
if (acsheet.getName() === '入力用' && cell.getColumn() === 1) {
jikkoucode();
}
}
厳密比較しなくていいなら、==を使った方がいいだろう。
GASでは<>を使用しない。
等しくない、を条件としたい場合は!==(厳密比較ver)、または!=というわけ分からん記号の組み合わせで比較する。
And使えねーじゃん。&&ってなんやねん。
if条件が二つある場合に使う。つまり、「且つ」。VBAの場合Andでつなぐのと同じ。
function onEdit(e) {
var acsheet = e.source.getActiveSheet();
var rng = e.range;
var clmn = rng.getColumn();
if (acsheet.getName() == '入力用' && clmn == 1) {
jikkoucode();
}
}
または(or)の場合は、||を使う。
||。||以上のなにものでもない。覚えるしかない記号の組み合わせってやつである。
GASは小文字大文字区別するらしい。
だったら自動で大文字変換しろよ!!
”でも’でもいい。
ダブルクォート、シングルクォートの違いは特になし。どっちでもいい、文字を囲うときにはお好きにどうぞってことらしい。