Google Apps Script(GAS)の基礎
GASを動かしてみよう
GASって何?...ものすごくざっくりいうとExcelマクロのスプレッドシート版です。
突き詰めていくと結構違うと思いますが、まずは「ふーん、スプシ版のマクロかぁ」くらいでいいと思います。
基本的にGoogleアカウントがあればだれでも使えるので、業務以外に個人で使いやすかったりするのもGASだったりします。
百聞は一見に如かず、まずは動かしてみましょう。
エディターを開く
まずは適当なスプレッドシートを作成し、「拡張機能」タブ>Apps Scriptをクリック

すると下記みたいなのが開くと思います。

ここにコードを記載して実行することでGASを動かすことができます。
Hello Worldを表示する
function myFunction() {
Browser.msgBox("Hello World")
}
エディターに上記コードを記載して、保存(Ctrl + S)し、「実行」をクリックしてみて下さい。
おそらく認証を求められます。
「ホントにこれ実行して大丈夫?」とGoogleに確認されるわけですね。

上記を進めたのちにアカウントにログイン


Googleで確認取れないよ、ホントに大丈夫?と聞かれますので添付図のようにクリック。
※今作ったばっかりで何も届け出やらしてないので、「素性が分からん」と判定されるわけです。
で、ログイン・許可と進めていくとようやく実行できるようになります。
実行後、スプシのほうに戻ると

Hello Worldが表示されているのでこれが確認できればOKです。
セルの操作
セルの選択 -値の入力・取得-
特定のセルを選択して、値を入力したり取得したりすることができます。
まずはgetRangeを使ってA1セルに「a」を入力してみましょう。
function A1() {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A1").setValue("a");
}
- SpreadsheetApp : スプレッドシートを操作するよ
- getActiveSpreadsheet() :どのスプシ? → 今操作してるスプシだよ
- getActiveSheet() : どのシート? → 今操作してるシート(Sheet1)だよ
- getRange("A1").setValue("a"); : A1セルにaを入力してね
だいぶめんどくさく見えますが 割と直感的に理解できるかなと思います。
同様にgetRange(row, column) を使ってA2セルに「b」を入力します。
function A2() {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(2, 1).setValue("b");
}
A1直指定に比べるとわかりにくいかもですが、getRange({縦(行)}, {横(列)})でセルを選択する方法です。
学校で習ったXY座標の読み方と縦横が逆転してるのが最初は混乱するかも?ですが、まあ...慣れてください笑
最後に、Hello Worldの際にも使ったmsgBoxを使って、A2セルに入力された内容を表示してみましょう。
function myFunction() {
Browser.msgBox(
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(2, 1).getValue()
);
}
変数とは
プログラムの中で「値を入れておく箱」のようなもの。
計算結果や文字を一時的に保存して使い回すことができます。
function sampleVariable() {
var number = 10; // 整数を入れる変数
var name = "田中さん"; // 文字列を入れる変数
Browser.msgBox(name + "の点数は" + number + "点です。");
}
JavaScript (GAS) では、var / let を使って変数を宣言します。
※データ型(整数・文字列など)は自動で判定されるため、VBAのように As Integer などの明示は不要です。
条件分岐
「もし○○なら~する、そうでなければ~する」という処理です。
function sampleIf() {
var score = 65;
if (score >= 70) {
Browser.msgBox("優秀です!");
} else if (score >= 60) {
Browser.msgBox("合格です!");
} else {
Browser.msgBox("落第!");
}
}
If (条件) {
(処理内容)
}
という形で、条件が満たされたときのみ処理を実行するというコードになります。
else ifは、2つ目・3つ目...の条件を設定でき、Elseは「それ以外」を示しています。
1点注意として、先に設定された条件を優先することを覚えておいてください。
function sampleIf() {
var score = 75;
if (score >= 60) {
Browser.msgBox("合格です!");
} else if (score >= 70) {
Browser.msgBox("優秀です!");
} else {
Browser.msgBox("落第!");
}
}
これだと、「合格です!」が表示されます。
scoreが75なのに、「優秀です!」が表示されないのは、先にscore>=60の条件を満たしてしまうので、そっちの処理が優先されていることが原因です。
条件設定のミスはあるあるなので、順番には十分に注意してコードを作成したいですね。
繰り返し処理
forを使った繰り返し
function testFor() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i = 1; i <= 10; i++) {
sheet.getRange(i, 1).setValue(i);
}
}
このコードを実行すると、A1~A10に「1~10」が順番に入力されます。
- var i = 1 : iという変数を使います、初期値は1です
- i <= 10 : iが10以下の時に処理を繰り返します
- i++ : 繰り返しのたびにiに1を加算します
という条件がforの中に記載されているので、「10回繰り返す」という処理になるわけです。
whileを使った繰り返し
function testWhile() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var i = 1;
while (i <= 10) {
sheet.getRange(i, 1).setValue(i);
i++;
}
}
while(条件){
(具体的な処理)
}
で記述し、条件が満たされる間処理を繰り返すという意味になります。
処理としてはforと同じようにA1~A10に「1~10」が順番に入力されます。
Tips:無限ループに注意!
i++ を書き忘れると、永遠にループして処理が止まりません。
GASの場合は実行時間に上限(6分程度)があるので自動的に停止しますが、実務では無限ループを避ける設計が重要です。
関数の利用
さて、これまでの内容は1つのfunctionの中に全処理を記述してきました。
しかし、処理が難しくなってくると全部書くととんでもないコード量になることも多いです。
また、同じような処理を何回もやっている場合、それを何か所にも記述するのは無駄も多いし、何より修正する場合に全部の修正が必要になって大変面倒です。
大体1,2個修正しそびれてバグを起こします
functionは1つだけである必要はなく、何個作ってもよいので、一部の処理を外出しすることができます。
関数とかメソッド、という呼び方もあり、関数を実行することを呼ぶと言ったりします。
function testFunc() {
var i = 3;
var result = judge(i);
Browser.msgBox(result);
}
function judge(i) {
if (i % 2 === 0) {
return "偶数です";
} else {
return "奇数です";
}
}
testFuncのコードを実行すると、iの数値に応じて「奇数です」「偶数です」が表示されます。
judge (i)
ここは、関数に渡す引数を設定します。
ExcelのSum関数で例えると
Sum(A1:A10)
という書き方をすると、A1~A10の合計を計算して、という処理になりますよね?
このA1~A10にあたるものを引数と言います。
judgeはiを1つ引数に設定できる関数ということですね。
return "xxx";
Sum関数であれば、合計した数値が計算結果として戻ってきますよね?
そんな感じで、"xxx"を戻すよ、ということを記述している部分になります。
この時、関数から戻ってくる"xxx"のことを戻り値・返り値と呼びます。
配列
複数のデータを1つの変数に格納することができ、そういった変数を配列と言います。
社員複数人がいるときに、1人1人変数を用意せずとも1つの変数にまとめて処理することが可能です。
function testArray() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var myArray = ["佐藤さん", "伊藤さん", "田中さん"];
for (var i = 0; i < myArray.length; i++) {
sheet.getRange(i + 1, 1).setValue(myArray[i]);
}
}
配列は0番から数えることに注意してください。
myArray[0]が1番目
myArray[1]が2番目
...
となります。
多次元配列
配列は下記のように次元を2つ以上持つことができます。
function test2DArray() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var myArray = [
["佐藤さん", 80],
["伊藤さん", 75],
["田中さん", 90]
];
for (var i = 0; i < myArray.length; i++) {
for (var j = 0; j < myArray[i].length; j++) {
sheet.getRange(i + 1, j + 1).setValue(myArray[i][j]);
}
}
}
2次元配列...というととっつきづらいイメージがあるかもですが、上のサンプルコードを実行すると下記のように表に書き込まれます。

セルと配列
2次元配列が行・列のデータだとすれば、セルのデータをまとめて2次元配列に格納することもできます。

こんな入力がされているとして、これを配列に格納するには
function getRangeAsArray() {
// アクティブシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// A1:C3 の範囲を取得
var range = sheet.getRange("A1:B3");
// 二次元配列として取得
var values = range.getValues();
var i = 2;
var j = 1;
Browser.msgBox((i + 1) + "行" + (j + 1) + "列目の値は" + values[i][j]);
}
と、範囲をまとめて配列に代入することができます。
何度も何度もセルにアクセスするより、1度でまとめて配列に入れてしまったほうが記述も簡単だし処理も早いしなので、ぜひ使えるようになっておきたいですね。
GASとChatGPT
ChatGPTじゃなくCoPilotでもGeminiでもいいですが、「あとはコード書くだけ!」まで落とし込めると生成AIはものすごい効力を発揮します。
ここまでの内容でGAS実行のイメージはついてきているかなと思うので、後は各自のルーティン業務をGASに落とし込んでいけば、「GASで業務効率化」ですね!
Discussion