MENU

【GAS】getRange/getValue/setValueの使い方|セルの読み書き基本(コピペOK)

GASでスプレッドシートを操作する第一歩が、セルの「読み書き」です。これは getRange で場所を指定し、getValue(読む)/ setValue(書く)で値をやり取りします。この記事では、コピペで動くコード例とつまずきポイントを、初めての方にも分かるように解説します。

この記事のポイント

  • 場所を決める getRange → 読む getValue/getValues → 書く setValue/setValues の3点セット
  • 行・列の番号は 1始まり(getRange(1, 1) がA1)
  • 1セルは getValue/setValue、複数セル(範囲)は getValues/setValues(2次元配列)
  • 大量データは1セルずつではなく範囲でまとめて読み書きすると速い
目次

まずは結論:3つの基本形

セル操作はこの3パターンを押さえればOKです。

function basic() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 読む:A1の値を取得
  const v = sheet.getRange("A1").getValue();
  Logger.log(v);

  // 書く:B1に値を入れる
  sheet.getRange("B1").setValue("こんにちは");
}

getActiveSpreadsheet().getActiveSheet() で「今開いているシート」を取得し、getRange() で対象セルを指定します。

getRangeでセルの場所を指定する4パターン

getRange は指定の仕方が2系統あります。用途で使い分けます。

書き方 意味
getRange("A1") A1の1セル
getRange("A1:C3") A1からC3の範囲
getRange(2, 1) 2行1列目(=A2)の1セル
getRange(2, 1, 5, 3) 2行1列目から「5行 × 3列」の範囲

注意:行・列の番号は 1始まりです(0始まりではない)。getRange(1, 1) がA1、getRange(1, 2) がB1になります。

読み込み:getValue と getValues

1セルだけなら getValue()、複数セル(範囲)なら getValues() を使います。getValues() は2次元配列(行の配列)で返ります。

function readValues() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 1セル
  const one = sheet.getRange("A1").getValue();

  // 範囲(2次元配列で返る)
  const values = sheet.getRange("A1:C3").getValues();
  Logger.log(values[0][0]); // 1行目1列目(A1)
  Logger.log(values[1][2]); // 2行目3列目(C2)
}

注意:範囲に対して getValue()(単数)を使うと、左上の1セルだけしか取れません。範囲は必ず getValues()(複数)です。

書き込み:setValue と setValues

書く側も同じく、1セルは setValue()、範囲は setValues()(2次元配列を渡す)です。

function writeValues() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 1セル
  sheet.getRange("A1").setValue("名前");

  // 1行ぶんをまとめて書く(1行 × 3列)
  sheet.getRange(1, 1, 1, 3).setValues([["名前", "年齢", "部署"]]);

  // 複数行を書く(3行 × 2列)
  sheet.getRange(2, 1, 3, 2).setValues([
    ["田中", 28],
    ["佐藤", 34],
    ["鈴木", 41]
  ]);
}

注意:setValues() に渡す配列の「行数 × 列数」は、getRange で指定した範囲とぴったり一致させる必要があります。ズレると「The number of rows in the data does not match…」というエラーになります。

実践:表データを全部読み込む

実務でよく使うのが「ヘッダーを除いてデータ行を全部取得」する形です。getLastRow() で最終行を取得して範囲を組み立てます。

function readAll() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // データが無いときは何もしない

  // 2行目から最終行まで、3列分を取得
  const data = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
  data.forEach(function(row) {
    Logger.log(row[0] + " / " + row[1] + " / " + row[2]);
  });
}

取得した2次元配列は、map や filter で加工すると一気に処理できます(配列操作は関連記事へ)。

よくあるつまずきと直し方

セルがズレる → 行・列が1始まりか確認(getRange(1,1)=A1)。

範囲なのに1つしか取れない → getValue()ではなくgetValues()(複数形)を使う。

setValuesでエラー → 渡す配列の形(行数×列数)が範囲と一致しているか確認。1行でも [["a","b"]] と2次元にする。

データが無い行まで読んでエラー → getLastRow() で範囲を決め、lastRow - 1 が0以下のときは処理しない。

ヒント:1セルずつ getValue/setValue をループで回すと遅くなります。範囲でまとめて getValues/setValues する方が圧倒的に高速です。

この記事のポイント(まとめ)

やりたいこと 使うもの
場所を指定 getRange("A1") / getRange(行, 列, 行数, 列数)
1セルを読む/書く getValue() / setValue()
範囲を読む/書く getValues() / setValues()(2次元配列)
全データ取得 getRange(2, 1, getLastRow()-1, 列数).getValues()
速度 1セルずつより範囲でまとめて

次のステップ

セルの読み書きができたら、取得したデータの加工や書式設定に進みましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次