👉 事前準備
- Google スプレッドシートを新規作成
- メニューから 拡張機能 → Apps Script を開く
- エディタにコードを貼り付け、▶実行 をクリック
- 初回は権限確認が出ます。ポップアップに沿って許可してください(「このアプリは確認されていません」→「詳細」→「安全ではないページに移動」を選ぶことがあります)
✅ 先におさえる超基本(超重要)
-
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);
}
ねらい:配列を動的に組み立てて書き込む練習。
-
numbersは 10行×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アカウント切り替えも要確認。
🔍 学びを深めるための追加練習(任意)
-
③を改造:A3:C5 の3行3列へ
-
getRange(3,1,3,3)に変更し、 -
setValues([["りんご","みかん","バナナ"],["桃","ぶどう","梨"],["柿","メロン","すいか"]])にしてみる。
-
-
⑨の表に列を追加:「出身地」列を加える
-
data[0].lengthを使う書き方なら、配列の形を増やすだけでOK。
-
-
⑩を動的化:10ではなく入力したNまでの連番に
- プロンプト(
SpreadsheetApp.getUi().prompt)でNを受け取り、配列を組み立ててみる。
- プロンプト(
🧯トラブル対処 早見表
| 症状 | 原因の定番 | 対応 |
|---|---|---|
| setValuesでエラー | 行数・列数と配列サイズ不一致 |
data.length と data[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から始まるのは「無駄を省くための合理性」なんです。