1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📘 Google Apps Script 初心者向けサンプル10選

1
Last updated at Posted at 2025-09-23

👉 事前準備

  1. Google スプレッドシートを新規作成
  2. メニューから 拡張機能 → Apps Script を開く
  3. エディタにコードを貼り付け、▶実行 をクリック
  4. 初回は権限確認が出ます。ポップアップに沿って許可してください(「このアプリは確認されていません」→「詳細」→「安全ではないページに移動」を選ぶことがあります)

✅ 先におさえる超基本(超重要)

  • SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
    今開いているスプレッドシートの「アクティブなシート」を取得します。
  • getRange(行, 列, 行数, 列数)1始まり(A1が 1,1)
    → GASのRangeは1始まりですが、**配列(setValuesに渡すデータ)は2次元配列で「行の配列の配列」**です。
    例:[["りんご","みかん","バナナ"]]1行3列 のデータ。
  • setValue は1セル、setValues は複数セル(2次元配列必須)
    エラーの典型:「一次元配列を渡してしまう」「行数と列数が合っていない」。

①「Hello, GAS!」を書き込む

function sample1() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(1, 1).setValue("Hello, GAS!");
}

ねらい:最小の「1セル書き込み」。getRange(1,1)A1セル
ポイントsetValue単一セル用。「一つの値を一つの場所に」。


② 日付を書き込む

function sample2() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(2, 1).setValue(new Date());
}

ねらいDate オブジェクトをそのままセルへ。
表示形式:シート側で日付表示(自動判定)。表示崩れたら 表示形式 → 数字 → 日付で整えましょう。


③ 複数セルにまとめて書き込む

function sample3() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(3, 1, 1, 3).setValues([["りんご", "みかん", "バナナ"]]);
}

ねらい1行3列の範囲に一括書き込み。
超重要setValues の引数は 2次元配列(行の配列)

  • 範囲:(開始行=3, 開始列=1, 行数=1, 列数=3) → A3:C3

  • データ:[ ["りんご","みかん","バナナ"] ]

    • 外側の [] …「行の並び」
    • 内側の [] …「その行のセル並び」
      よくある質問:「なぜ角カッコが二つ?」→ 2次元配列(表形式)だからです。

④ 縦にリストを書き込む

function sample4() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = [["A"], ["B"], ["C"], ["D"]];
  sheet.getRange(4, 1, data.length, 1).setValues(data);
}

ねらい4行1列ぶんを一気に。

  • データは 4行×1列 の2次元配列:[["A"],["B"],["C"],["D"]]
  • 範囲は 行数 = data.length列数 = 1 で一致させる。

⑤ シートをクリアしてから書き込む

function sample5() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();
  sheet.getRange(1, 1).setValue("リセットして書き込みました");
}

ねらい:既存データを一括消去 → メッセージを設置。
注意clear()値・書式・メモも消します。値だけ消したいなら clearContent()


⑥ 書き込んだセルを太字にする

function sample6() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(6, 1);
  cell.setValue("太字テキスト");
  cell.setFontWeight("bold");
}

ねらいと**書式(フォント太さ)**をセットで扱う。
補足:複数セルの太字は getRange(...).setFontWeights(二次元配列) も可。


⑦ 書き込んだセルの背景色を変える

function sample7() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(7, 1);
  cell.setValue("背景色つき");
  cell.setBackground("yellow");
}

ねらい:背景色(塗りつぶし)を変更。
色指定:英語色名("yellow")または HEX("#FFFF00")。


⑧ 書き込んだセルの文字色を変える

function sample8() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(8, 1);
  cell.setValue("赤文字");
  cell.setFontColor("red");
}

ねらい:文字色の変更。背景色と同じくカラー名 or HEX。


⑨ 2行×2列の表を作る

function sample9() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = [
    ["名前", "年齢"],
    ["山田太郎", 25],
    ["佐藤花子", 30]
  ];
  sheet.getRange(9, 1, data.length, data[0].length).setValues(data);
}

ねらい見出し+データ行の表を一括配置。

  • 行数は data.length、列数は 先頭行の長さ data[0].length を使うのが定石。
  • 列が増減してもコード修正が最小で済む。

⑩ 連番を自動で書き込む

function sample10() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const numbers = [];
  for (let i = 1; i <= 10; i++) {
    numbers.push([i]);
  }
  sheet.getRange(20, 1, numbers.length, 1).setValues(numbers);
}

ねらい配列を動的に組み立てて書き込む練習。

  • numbers10行×1列 の2次元配列にする([i] をさらに [] で包む)。

🧭 図解で理解する:Range と setValues の関係

Range(開始行r, 開始列c, 行数R, 列数C)

  書き込む配列 data は  R 行 × C 列 の 2次元配列
  data = [
    [r1c1, r1c2, ... r1cC],
    [r2c1, r2c2, ... r2cC],
    ...
    [rRc1, rRc2, ... rRcC]
  ]
  • 行方向が外側の配列列方向が内側の配列
  • Excel/スプレシートの表をそのまま配列に写したイメージでOK。

❓よくある質問(つまずき救済)

Q1. 「なぜ setValues は “二次元配列” が必要?」

A. スプレッドシートは表(行×列)です。setValues は「表全体を一度にセットする」ため、行の配列(外側)の中に各行のセル配列(内側)が必要になります。
例:[["A","B","C"]] は1行3列、[["A"],["B"],["C"]] は3行1列

Q2. 「配列は0始まりって聞いたのに、Rangeは1始まり?」

A. 配列の添字(インデックス)は0始まりが多い言語仕様ですが、GASの getRange(行,列,...) は1始まり(シートの行列番号と同じ)です。

  • 配列側:「最初の要素」は index 0
  • Range側:「最初のセル」は getRange(1,1)(A1)
    世界が違うと覚えると混乱しません。

Q3. 「The number of columns in the data does not match… と怒られた」

A. getRange(... 行数, 列数 ...)setValues(配列)行数・列数が一致していないときに出ます。

  • まず data.length(行数)と data[0].length(列数)を getRange に合わせているかを確認。

Q4. 「ログはどこに出る?」

A. Logger.log(...) を使った場合、エディタ上部メニュー 表示 → 実行ログ で確認できます。
(今回のサンプルでは Logger は使っていませんが、デバッグに必須です)

Q5. 「権限が通らない/エラーになる」

A. 新規スクリプトは初回実行時に権限付与が必要。ポップアップの詳細を開き、(安全ではない)に進むの選択で許可できます。Googleアカウント切り替えも要確認。


🔍 学びを深めるための追加練習(任意)

  1. ③を改造:A3:C5 の3行3列へ

    • getRange(3,1,3,3) に変更し、
    • setValues([["りんご","みかん","バナナ"],["桃","ぶどう","梨"],["柿","メロン","すいか"]]) にしてみる。
  2. ⑨の表に列を追加:「出身地」列を加える

    • data[0].length を使う書き方なら、配列の形を増やすだけでOK。
  3. ⑩を動的化:10ではなく入力したNまでの連番に

    • プロンプト(SpreadsheetApp.getUi().prompt)でNを受け取り、配列を組み立ててみる。

🧯トラブル対処 早見表

症状 原因の定番 対応
setValuesでエラー 行数・列数と配列サイズ不一致 data.lengthdata[0].length を使って範囲指定
日本語が文字化け 表示形式やフォントの問題 シートの表示形式を標準に戻す/フォントを変える
日付が数字になる シリアル値表示 シート側で日付表示形式に変更
何も書かれない シートが違う/保護状態 アクティブシートを確認/保護解除
権限エラー 初回許可未実施 ポップアップの手順に沿って許可する

🧩 コード(そのままコピペOK)

以下は説明用コメントなし版(最短)。すでに貼っている場合はこのままでOKです。

function sample1() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(1, 1).setValue("Hello, GAS!");
}
function sample2() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(2, 1).setValue(new Date());
}
function sample3() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(3, 1, 1, 3).setValues([["りんご", "みかん", "バナナ"]]);
}
function sample4() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = [["A"], ["B"], ["C"], ["D"]];
  sheet.getRange(4, 1, data.length, 1).setValues(data);
}
function sample5() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clear();
  sheet.getRange(1, 1).setValue("リセットして書き込みました");
}
function sample6() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(6, 1);
  cell.setValue("太字テキスト");
  cell.setFontWeight("bold");
}
function sample7() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(7, 1);
  cell.setValue("背景色つき");
  cell.setBackground("yellow");
}
function sample8() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getRange(8, 1);
  cell.setValue("赤文字");
  cell.setFontColor("red");
}
function sample9() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = [
    ["名前", "年齢"],
    ["山田太郎", 25],
    ["佐藤花子", 30]
  ];
  sheet.getRange(9, 1, data.length, data[0].length).setValues(data);
}
function sample10() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const numbers = [];
  for (let i = 1; i <= 10; i++) {
    numbers.push([i]);
  }
  sheet.getRange(20, 1, numbers.length, 1).setValues(numbers);
}

🧾 まとめ

setValue(1セル)/setValues(複数セル・2次元配列)の違いを体感しよう

Rangeは1始まり、配列は2次元表(行の配列)で渡す

小さい成功体験を積むのが近道。まずは①〜③で書ける手応えを!

💡補足:インデックス番号が0から始まる理由

プログラミング言語の配列は、多くが 0から数え始める 仕様です。

メモリの「最初の場所」を 基準点(0番目) として扱う方が計算がシンプルで効率的。

もし1から始めると、毎回「-1」して計算する必要があるため非効率。

歴史的にC言語などの影響で 0始まりが標準 になりました。

👉 つまり、0から始まるのは「無駄を省くための合理性」なんです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?