見出し画像

GAS#2 プログラムの基礎(変数・ループ・判定)

こんにちは静岡在住の某SEです。
#1 ではGASの特徴についての解説と、簡単なプログラムを書いて実行するところまで実践してみました。

本章ではプログラミングの基礎となる変数・ループ・判定について解説していきます。

⚠️事前準備⚠️
スプレッドシート:+ボタンで、シート2を作成しましょう
スクリプト:myFunction1 をコピーして myFunction2 を作成しましょう

変数について

前回のおさらいです。下記のコードで「A1セル」に「テスト」という文字を書き込むことができましたね。

function myFunction1() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  sheet.getRange(1,1).setValue('テスト');
}

このコードを 変数 を使って分かりやすいく書き換えてみましょう。
(変数とは値を保持しておくための箱のことです。)


function myFunction2() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  let row = 1;
  let col = 1;
  let text = 'テスト';
  sheet.getRange( row, col ).setValue( text );
}

コードからなんとなくイメージできたでしょうか?
let という文字の後に名前を記述することで、数値や文字列を入れておくための 箱(変数)を作ることができます。

4 | let row = 1;
上記のコードでは、「 row という名前の箱を作って、その中に数字の1を代入する」という処理になります。
プログラミングでは イコール が1個の場合は左側への代入を意味します。
数学のイコールとは意味が若干異なりますね。
左矢印(←)のような感覚でとらえてください。

※文字を代入する場合は値をシングルクォート(')で囲んでください。
※数値を代入する場合はそのまま記述してください。

7 | heet.getRange( row, col ).setValue( text );
つまり、最終行では「row 行目・col 列目のセルに、text の中身を書き込む
という処理となります。
実行すると前回と同じようにA1セルに文字を書き込むことができましたね。

今度は1行目~6行目に文字を書いてみます。

function myFunction2() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  let row = 1;
  let col = 1;
  let text = 'テスト';

  // 1行目から6行目まで文字を書く
  sheet.getRange( row, col ).setValue( text );
  row = row + 1;
  sheet.getRange( row, col ).setValue( text );
  row = row + 1;
  sheet.getRange( row, col ).setValue( text );
  row = row + 1;
  sheet.getRange( row, col ).setValue( text );
  row = row + 1;
  sheet.getRange( row, col ).setValue( text );
  row = row + 1;
  sheet.getRange( row, col ).setValue( text );
}

10 | row = row + 1;
見慣れない記述が出てきましたね。これは、
row という名前の箱に、現在の row の中身と 1 を足した結果を代入する
という処理となります。

実行すると6行目まで書き込むことができました!

ループ処理(for)について

コードをよく見ると同じような記述が並んでいますよね?
こんな時は ループ処理( for文 )を使ってみましょう。

function myFunction2() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  let col = 1;
  let text = 'テスト';

  // 1行目から6行目まで文字を書く
  for( let i = 1; i < 7; i++){
    sheet.getRange( i, col ).setValue( text );
  }
}

コードが急に複雑になったので図解してみます。

1回目のループでは i の中は 1 なので、1行目に文字が書き込まれます。
同様に2回目では2行目に文字が書き込まれます。
6行書き終わって7回目のループに入る時に i に 1 を加算したら 7 ですね。
その状態で判定に入ると i は 7 よりも小さくはないため、ループから外れて、7行目に文字が書き込まれることはありません。

判定(if)について

続いて、判定式(if)を試してみましょう。
今回は行数に応じてセルの背景色を変えてみたいと思います。

function myFunction2() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  let col = 1;
  let text = 'テスト';

  // 1行目から6行目まで文字を書く
  // 偶数行は背景をピンク、奇数行は背景を水色にする
  for( let i = 1; i < 7; i++)  {

    if( i % 2 == 0 ){
      sheet.getRange( i, col ).setBackground('#f4cccc');
    } else {
      sheet.getRange( i, col ).setBackground('#cfe2f3');
    }

    sheet.getRange( i, col ).setValue( text );
  }
}

前提知識として、i%2 は i を2で割った時の余りを表します。
偶数なら0、奇数なら1となりますね。

それでは if の ( ) の中身を見てみましょう。
先ほど、変数への代入でイコールを1個で使いましたが、そちらと混同しないように「等しいかの判定」では「イコールを2個連続したもの」を1つの記号として扱います。

if の判定が正しければ、直後の { } の中が実行されます。
余りが0と等しいということは、偶数なので背景色にピンク(#f4cccc)をセットしています。

その後に else という文字が登場しますが、これは if の判定がNGだった場合に { } の中が実行されます。
余りが1ということは奇数なので、背景色に水色(#cfe2f3)をセットしています。

プログラムを実行してシートに戻ってみると、水色とピンクの交互に背景が塗られていました!

総括

かなり駆け足でプログラミングのとても重要な基礎となる
変数・ループ・判定 を実践してみましたが、いかがでしたでしょうか?
理解を深めるためにも、ぜひサンプルコードを改造して、自分流のループや判定を組み立ててみてください。
例えば、背景を塗る色をピンク・水色・黄緑の3色に変えてみてもいいですね。

基礎までできたので、次回はより実践的なスプレッドシートの操作について解説していきたいと思います。
この記事が気に入っていただけた方は、記事への💛と noteのフォローをしてお待ちください。

追記:#2.5 を公開しました!

この記事が気に入ったらサポートをしてみませんか?