【GAS実践入門】スプレッドシートの取得・値の読み書きを丁寧に解説

GASを触りはじめると最初に出てくる「getRange」「getValue」あたりのコードです。
コピペで動くけど、意味がわからずモヤモヤしていた当時の自分のために整理しました。

このブログは、Google Apps Script(GAS)を使った自作ツールの記録や、開発の過程での気づきをまとめたものです。
丁寧な解説というより、「こんなこともGASでできるんだ」というアイディアのきっかけになれば幸いです。

目次

スプレッドシートの取得方法

GASを初めて使う方は、コードを開く・実行する基本操作と、初回実行時の認証をご確認ください。

よく見るのがこれ:

SpreadsheetApp.getActiveSpreadsheet()

これは「今開いているスプレッドシート」を取得する書き方です。とりあえず動かしたいときに便利ですが、シートが複数あるときは挙動に注意が必要です。

名前でシートを指定する:

SpreadsheetApp.getSheetByName("シート1")

シートの名前で指定することで、対象のシートを明確に指定できます。

スプレッドシートのIDから取得する:

SpreadsheetApp.openById("スプレッドシートのID")

複数のスプレッドシートを操作したいときに便利です。この書き方なら、「別ファイル」も扱うことができます。

getRange() の書き方いろいろ:最初はここでつまずいた

getRange() はセルの位置や範囲を指定するためのメソッドですが、書き方にバリエーションがあり、初心者の頃はよく混乱しました。
特に、「A1形式」と「行・列で指定する形式」の違いに気づくまでに少し時間がかかりました。以下に代表的な3パターンを整理しておきます。

書き方 意味 例
getRange("B3") A1形式で指定 「B3」の1セルを取得
getRange(3, 2) 行・列で1セルだけ取得 3行2列目 → 「B3」を取得
getRange(3, 2, 2, 2) 行・列 + 行数・列数で範囲指定 3行2列から2行2列 → 「B3:C4」を取得

最初は「A1形式」ばかり使っていましたが、あとからgetRange(行, 列, 行数, 列数)のような指定ができると、ループ処理での範囲操作や表形式のデータ処理が一気にやりやすくなることに気づきました。
たとえば、「上から10行分をまとめて取得して別の場所に貼り付ける」ような処理が、行列指定だととてもスムーズに書けます。

また、動的に行数や列数を計算してgetRange(row, col, numRows, numCols)を使うと、柔軟な処理が可能になるため、コピペから一歩進んで「自分で制御するコード」に近づける感覚がありました。

getValue() / getValues() / setValue() / setValues() の違いは?

これらのメソッドは、スプレッドシートから値を取得・設定するうえで最もよく使うものです。
似ている名前なので混乱しやすく、初心者が最初につまずくポイントでもあります。
特に、配列を扱うメソッドと単一の値を扱うメソッドを混同すると、undefined やエラーになってしまうこともあります。

メソッド 対象の範囲 データ形式 よくある用途
getValue() 1セルのみ 単一の値(文字列・数値など) 特定セルの値を読み取る
getValues() 複数セル 2次元配列 表全体を取得する、ループ処理用
setValue() 1セルのみ 単一の値をセット 特定のセルに1つの値を書き込む
setValues() 複数セル 2次元配列でセット 複数のセルにまとめて書き込む

getValue() の例

1つのセルから値を読み取ります。

function readSingleCell() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  const value = sheet.getRange("B3").getValue();
  Logger.log(value); // 単一の値(例:"テスト")
}

getValues() の例

複数のセルから値を取得する場合、2次元配列で返ってきます。

function readMultipleCells() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  const data = sheet.getRange("A1:C3").getValues();
  Logger.log(data); // [[A1, B1, C1], [A2, B2, C2], [A3, B3, C3]]
}

setValue() の例

1セルに値を直接書き込むときに使います。

function writeSingleCell() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  sheet.getRange("A1").setValue("こんにちは");
}

setValues() の例

複数のセルに対して2次元配列で値を設定します。

function writeMultipleCells() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  const values = [
    ["A1", "B1", "C1"],
    ["A2", "B2", "C2"],
    ["A3", "B3", "C3"]
  ];
  sheet.getRange("A1:C3").setValues(values);
}

よくあるミス

  • getValues() の結果(2次元配列)を setValue() に渡してエラーになる
  • setValues() でセル範囲のサイズと配列のサイズが一致していない(例:3×3セルに2×2の配列)
  • 1セルを取得したいのに getValues() を使って、[[値]] の配列になってしまい扱いづらくなる

特に初心者の頃は「getValueとgetValuesの違いって何?」とよくわからないまま使っていて、エラーが出てようやく気づくことも多かったです。
データ形式(単一値か配列か)を意識することがとても大事です。

これが理解できると何ができる?

getRange() や getValue() / setValues() といった基本的な読み書きの仕組みが理解できると、GASで扱える範囲が一気に広がります。

  • スプレッドシートの読み書きが自由自在にできるようになる
    値の取得、書き込み、範囲操作が自在になると、単純な記録から複雑な集計・加工まで自動化できます。
  • 「とりあえず動いた」から「ちゃんと狙って処理する」へ
    コピペで動かすフェーズから、「このセルの値を使って、この範囲を書き換える」といった意図的な処理にステップアップできます。
  • 値の貼り付け、移動、ループ処理がしやすくなってツール化につながる
    ループと組み合わせることで、「行ごとのチェック」や「条件による分岐処理」など、業務の自動化ツールが作れるようになります。
  • GASでの自動化の基礎が身につく
    GASのスクリプトは基本的に「値を読む → 加工する → 書く」の繰り返しです。これができれば、あとは応用次第で実用的なツールが作れます。

実際に作って役立った場面(体験談)

基本の書き方が理解できるようになってから、以下のようなツールを作れるようになりました。どれも最初は小さなスクリプトから始まりましたが、業務の中で十分使えるレベルまで育ちました。

  • 日次で他のスプレッドシートからデータを引っ張って一覧化するツール
    各担当者が入力した別ファイルのデータを、1つのファイルに自動集計。朝一で「最新の一覧」ができていて便利でした。
  • 指定したセルにだけコメントを追記するツール
    社内で「レビュー済」や「確認済」などのコメントを、特定の条件で自動で書き込むツールを作りました。
  • 表の特定範囲だけをコピーして別シートに貼り付ける処理
    毎月提出する報告書用に、必要な行だけを抽出して整理した形で貼り付ける処理。転記ミスがゼロに。

最初は「どう書くか」に必死でしたが、少しずつ慣れるうちに「何をしたいか」→「それをコードでどう書くか」という思考に変わってきました。
この切り替えができるようになると、コピペから卒業して、オリジナルの処理が書けるようになっていきました。

よくやったミス&気をつけてること

GASをいじり始めたころ、何度も同じようなミスを繰り返していました。
エラーになって初めて「そういう仕様だったのか」と気づくことも多く、今でも気をつけるようにしています。

  • getValue() したのに 2次元配列扱いして undefined
    1セルだけ取得したつもりなのに、配列としてループしようとして失敗。
    getValue()は単一値、getValues()は2次元配列という区別が大事。
  • A1指定のつもりで getRange(1,1) と書いてた
    「B3」と書くつもりで getRange(3,2) にしないとズレるのに、慣れないうちは混乱しがち。
  • setValues() の対象セルと配列サイズが合っていない
    [[1,2],[3,4]] のような配列を 1行1列 に書き込もうとしてエラー。
    セル範囲と配列サイズが一致しているか、いつも確認が必要。
  • .getSheetByName() のシート名が微妙に違っていて null が返る
    全角スペースや大文字・小文字の違いで一致しないことも。
    sheet == null のチェックを必ず入れるようになった。

こうした小さなミスでも、エラーの原因がわかれば大きな学びになります。

まとめ

最初のうちは、「コピペで動いたからOK」と思って満足していました。
でも、処理の意味や構造を理解するようになってからは、ただ動くだけでなく、「なぜそう書いてあるのか」「何をしているのか」を考えるようになりました。

書き方がわかると、今度は応用がきくようになり、自分なりの改善やカスタマイズができるようになります。
GASはシンプルだからこそ、自分の業務やアイディアに合わせてどんどん展開できるのが魅力です。

この記事が、同じように「動くけど、意味がわからない」で止まっていた誰かの助けになればうれしいです。
自分の過去のつまずきが、これからの誰かのヒントになりますように。

トップページへ戻る