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 を公開しました!
この記事が気に入ったらサポートをしてみませんか?