ボロボロ皇帝のボロ切れと塊

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。たまにExcel、家電、音楽等についても好きに吐いてる。

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。
Excel、家電、音楽、ゲームイラスト小説映画、性癖について等、何でも好きに吐いてる。

どうでも良いかもしれんが背景色変わっていくの見てくれ。
更にどうでも良いかもしれんがアイコンが息してるの見てくれ。


我輩は何にも制約されない身、
「耐えぬ」事を恐れないと決めたのだ!
我輩は好きなときに悪態をつく!
妬み僻み嫉みを背負い、
マイナーだろうが邪道だろうが
我輩は我輩の道を行く!
好きなものは懸命で不器用な諸君,
嫌いなものは器用で完璧を気取った奴らだ。
         

【GAS】特定セルに特定の値が入ったときだけ実行されるコードを例に不満を垂れながら比較論理演算子とか==と===、シングルクォートとダブルクォート何がちゃうねん、みたいな備忘録

⚠注意⚠GAS初心者のただの嘆きと、意味わからん記号の使い方についての備忘録。

 

 

昨日予告した通り、本日はGASへの不満を述べていくわけだが、気付いたら備忘録みたいになっていたので、不満兼備忘録と思ってくれてもよいだろう。なんと有用なんだ!素晴らしい!

 

また、一応、特定セル(A)に特定の値が入ったときだけ特定セル(B)に特定のワードをぶち込む、みたいな単純コードもある(例として)。

 

 

ではさっそく、やっぱExcelにはかなわんな、と思う点を個人の主観で述べていこう。

あんま要らないかもしれないが、目次↓

 

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↓

f:id:wornoutemperor:20220127223159j:plain

 

After↓

f:id:wornoutemperor:20220127223229j:plain



このように、編集判定の条件を指定しているのに、その条件関係無くとりあえず実行されるというアホさ。

恐らく、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は小文字大文字区別するらしい

だったら自動で大文字変換しろよ!!

 

”でも’でもいい。

ダブルクォート、シングルクォートの違いは特になし。どっちでもいい、文字を囲うときにはお好きにどうぞってことらしい。