エンジニアになりたい人募集!X(旧Twitter)からフォローしたらリプライで質問常時OK!

【GAS】スプレッドシートからセルの値を取得・追加するベストプラクティス

この記事はで読むことができます。

はじめに

GASでスプレッドシートを操作する場合の基本となるセルの値の取得・追加の方法を解説します。

この記事では以下のステップでコードを解説しています。

1. スプレッドシートを取得する

GASでスプレッドシートの操作を行うにはSpreadsheetAppクラスを使用してスプレッドシートオブジェクトを生成します。
スプレッドシートオブジェクトを生成するメソッドは次の5つです。

  • SpreadsheetApp.openById(id)
  • SpreadsheetApp.openByUrl(url)
  • SpreadsheetApp.open(file)
  • SpreadsheetApp.getActive()
  • SpreadsheetApp.getActiveSpreadsheet()

ファイルの指定方法とそれぞれのメソッドの使い方を見ていきましょう。

1.1. ファイルIDで指定

ファイル作成時に生成されるファイルIDを使用して指定します。
ファイルIDはスプレッドシートのURLから確認することが可能です。
https://docs.google.com/spreadsheets/d/{ファイルID}/

gas
const ss = SpreadsheetApp.openById("{ファイルID}");

1.2. URLで指定

スプレッドシートのURLを入れて指定します。
https://docs.google.com/spreadsheets/d/xxxxxxx/
※ edit 以降はあっても動作しますが、ない方がシンプルでわかりやすいです

gas
const ss = SpreadsheetApp.openByUrl("{ファイルURL}");

1.3. ファイルオブジェクトを渡して指定

DriveAppクラスで取得したファイルオブジェクトを入れて指定します。
主にフォルダ内のファイルを取得した後にスプレッドシートとして操作する場合に用います。

gas
const ss = SpreadsheetApp.open({ファイルオブジェクト});

【使用例】マイドライブ直下のスプレッドシートファイルを取得し、順にスプレッドシートオブジェクト化しています

gas
const files = DriveApp.getRootFolder().searchFiles('mimeType = "application/vnd.google-apps.spreadsheet"');
while (files.hasNext()) {
  const file = files.next();
  const ss = SpreadsheetApp.open(file);
 // ここに処理を記載
}

1.4. GASに紐づくスプレッドシートを指定

GASと紐づいているスプレッドシートを指定します。
GASをスプレッドシートから作成した場合に使用可能な指定方法です。

gas
const ss = SpreadsheetApp.getActive();
gas
const ss = SpreadsheetApp.getActiveSpreadsheet();

Object.getActive()Object.getActiveSpreadsheet()に違いはありません

2. シートを取得する

スプレッドシートオブジェクトに対してSpreadsheetクラスを使用してシートオブジェクトを生成します。
シートオブジェクトを生成するメソッドは次の3つです。

  • SpreadsheetObject.getSheetByName(name)
  • SpreadsheetObject.getSheets()
  • SpreadsheetObject.getActiveSheet()

シートの指定方法とそれぞれのメソッドの使い方を見ていきましょう。

2.1. 名前で指定

シートに設定されている名前を入れて指定します。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");

2.2. 全シートをシートオブジェクト型で取得

スプレッドシート内の全シートをシートオブジェクトとして一次元配列に格納された状態で取得します。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheets = ss.getSheets();

【使用例】配列の中身をそのままシートオブジェクトとして利用可能です。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheets = ss.getSheets();
sheets.forEach(function(sheet){
  // ここに処理を記載
})

2.3. 選択中のシートを指定

現在選択しているシートを指定します。
GASをスプレッドシートから作成した場合かつGASをスプレッドシート上で動かす処理に使用可能な指定方法です。

gas
const ss = SpreadsheetApp.getActive();
const sheet = ss.getActiveSheet();

3. セルを指定する

シートオブジェクトに対してSheetクラスを使用してレンジオブジェクトを生成します。
レンジオブジェクトを生成するメソッドは次の5つです。

  • SheetObject.getDataRange()
  • SheetObject.getRange(row, column [, numRows, numColumns])
  • SheetObject.getRange(セル範囲)
  • SheetObject.getActiveRange()
  • SheetObject.getCurrentCell()

セルの指定方法とそれぞれのメソッドの使い方を見ていきましょう。

3.1. データがあるセルを指定

A1セルを起点にデータが入っている最下行、最右列までの範囲を指定します。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getDataRange();

3.2. 行位置・列位置・行数・列数で指定

行位置・列位置で起点になるセルを指定し、行数・列数で範囲を指定します。
以下の場合、2行目1列目から3行4列の範囲のため、SheetObject.getRange(2, 1, 3, 4)になります。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});

指定するのが1セルであれば行数と列数は不要です。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置});

指定する範囲が1列のみであれば列数は不要です。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数});

3.3. セル範囲を指定

“A1” や “B3:C5” 等のセル範囲で指定します。
※ 名前付き範囲やR1C1形式でも指定可能です

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange("{セル範囲}");

3.4. 選択中のセル範囲を指定

現在選択しているセル範囲を指定します。
GASをスプレッドシートから作成した場合かつGASをスプレッドシート上で動かす処理に使用可能な指定方法です。

gas
const ss = SpreadsheetApp.getActive();
const sheet = ss.getActiveSheet();
const range = sheet.getActiveRange();

3.5. 選択中のセルで指定

現在選択しているセルを指定します。
GASをスプレッドシートから作成した場合かつGASをスプレッドシート上で動かす処理に使用可能な指定方法です。

gas
const ss = SpreadsheetApp.getActive();
const sheet = ss.getActiveSheet();
const range = sheet.getCurrentCell();

Object.getActiveCell()でも同様の動作をしますが、GoogleからObject.getCurrentCell()の使用が推奨されています

4. セルの値を取得する

レンジオブジェクトに対してRangeクラスを使用して値を取得します。
値を取得するメソッドは次の2つです。

  • RangeObject.getValue()
  • RangeObject.getValues()

それぞれのメソッドの使い方を見ていきましょう。

4.1. 単一セルの値を取得

レンジオブジェクト内の一番左上のセルの値を取得します。
A1:C3セルをレンジオブジェクトに格納している場合、A1のセルの値を取得します。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
const value = range.getValue();

4.2. 範囲内の全てのセルの値を取得

レンジオブジェクト内の全てのセルの値を取得します。
取得した値は一階層目が行、二階層目が列として二次元配列で格納されます。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
const value = range.getValues();

【使用例】赤枠の値を取得し、C3セルの値を出力しています。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange("A2:D4");
const value = range.getValues();
console.log(value[1][2]);

5. セルに値を書き込む

レンジオブジェクトに対してRangeクラスを使用して値を書き込みます。
値を書き込むメソッドは次の6つです。

  • RangeObject.setValue(value)
  • RangeObject.setValues(values)
  • RangeObject.setFormula(formula)
  • RangeObject.setFormulas(formulas)
  • RangeObject.setFormulaR1C1(formula)
  • RangeObject.setFormulasR1C1(formulas)

値の書き込み方とそれぞれのメソッドの使い方を見ていきましょう。

4.1. 単一の値を書き込む

セルに数値・文字列・ブール値・日付などの値を書き込むためのメソッドです。
複数セルに対して実行した場合、同一の値が書き込まれます。

“=”をつけることで数式を書き込むことも可能ですが、後述のRangeObject.setFormula(formula)が推奨されます。
使用する場合の挙動についてはRangeObject.setFormula(formula)を参照ください。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setValue({値});

4.2. 複数の値を書き込む

セルに数値・文字列・ブール値・日付などの値を書き込むためのメソッドです。
セル範囲と同じ行数・列数の二次元配列である必要があります。

“=”をつけることで数式を書き込むことも可能ですが、後述のRangeObject.setFormulas(formulas)が推奨されます。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setValues({二次元配列});

4.3. 単一の数式を書き込む

セルに数式を書き込むためのメソッドです。
複数セルに対して実行した場合、一番左上のセルを基準に相対参照で書き込まれます。
相対参照にしたくない場合は数式を絶対参照にしてください。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setFormula("{数式}");

数式をR1C1形式で記述する場合は以下のメソッドになります。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setFormulaR1C1("{数式}");

4.4. 複数の数式を書き込む

セルに数式を書き込むためのメソッドです。
セル範囲と同じ行数・列数の二次元配列である必要があります。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setFormulas({二次元配列});

数式をR1C1形式で記述する場合は以下のメソッドになります。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
const range = sheet.getRange({行位置}, {列位置}, {行数}, {列数});
range.setFormulasR1C1({二次元配列});

6. 【番外編】レコードを追加する

シートオブジェクトに対してSheetクラスのSheetObject.appendRow(rowContents)を使用してデータが入っている最下行の下にレコードの追加が行えます。
追加するデータは一次元配列である必要があります。
数値・文字列・ブール値・日付の他、”=”をつけることで数式も追加可能です。

gas
const ss = SpreadsheetApp.openById("{ファイルID}");
const sheet = ss.getSheetByName("{シート名}");
sheet.appendRow({一次元配列});

7. 【番外編】選択中要素の取得について

各クラスに用意されているObject.getActiveXXXX()等のメソッドの対象は「選択中のXXX」です。
そのため、スプレッドシート等のオブジェクトがなくてもSpreadsheetAppクラスで直接取得が可能です。

本記事で紹介したうち、以下の3つのメソッドが対象になります。

  • SpreadsheetApp.getActiveSheet()
  • SpreadsheetApp.getActiveRange()
  • SpreadsheetApp.getCurrentCell()

まとめ

GASでスプレッドシートを操作する場合の基本となるセルの値の取得・追加の方法を解説しました。
スプレッドシートへの入出力は他の機能とも連携しやすく汎用性が高いので、ぜひ活用してみてください。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)