【GAS】スプレッドシートに書き込む

兎にも角にもスプレッドシートと Apps Script を作る

スプレッドシートはきっと誰でも作れるはず。
スプレッドシートを作ったら Apps Script のプロジェクトを作る。
この時2種類の作り方があります。

  1. スプレッドシートと Apps Script を紐付ける方法
  2. スプレッドシートと Apps Script を紐付けない方法・・・・・・・

1.紐付ける場合はスプレッドシート内でApps Script を作成する

2.紐付けない場合はマイドライブ内でApps Script を作成する

Apps Script がスプレッドシートに紐付いていないと出来ないこと(使用できない関数)があります。
ちなみに私がハマった(出来なくて調べ回った)のはイベント周りでした。

1.紐付けた場合、イベントのソースを選択欄に「スプレッドシートから」がある

2.紐付けていない場合は、イベントのソースを選択欄に「スプレッドシートから」がない

特にスプレッドシートのイベントを利用する予定が無い場合は、2の紐付けをせずに作成で良いかと思います。
というのも、スプレッドシートと紐付けをした場合は Apps Script を開くために、紐付けたスプレッドシートを開かなくてはならないからです。

まぁ、好みなのでどちらでも大丈夫です。
今回は紐付け無い方でやります。
スプレッドシートのファイル名や Apps Script のファイル名はご自由にどうぞ。

とりあえず書き込んでみる

とりあえず、書き込んでみます。

何も入力されていない状態から

自由に追記できるようにするのが目標です

let chatBotSpreadsheet = null;
// スプレッドシートを取得する
function getSpreadsheet() {
  // スプレッドシートの ID
  const SSID = 'スプレッドシートの ID';
  // スプレッドシートを開く
  if(chatBotSpreadsheet === null) chatBotSpreadsheet = SpreadsheetApp.openById(SSID);
  return chatBotSpreadsheet;
}

// テキストを最終行のセルに追記する
// @param string text
function writeToLastCell(text) {
  // Spreadsheet クラスから Sheet クラスを取得
  const sheet = getSpreadsheet().getSheets()[0];
 // Sheet の最終行A列を取得し、 text を書き込む
  sheet.getRange(sheet.getLastRow() + 1, 1).setValue(text); // 書き込み
}

// テキストを最終行に追記する
// @param [string, string...] texts
function writeToLastRange(texts) {
  // Spreadsheet クラスから Sheet クラスを取得
  const sheet = getSpreadsheet().getSheets()[0];
  // 最終行に追記する
  sheet.appendRow(texts); // 書き込み
}

// テキストを最終行に複数行追記する
// 配列の要素数に気をつける
// @param [[string, string], [string, string]] texts
function writeToLastRanges(texts) {
  // Spreadsheet クラスから Sheet クラスを取得
  const sheet = getSpreadsheet().getSheets()[0];
 // Sheet の最終行A列から配列の要素数分を取得し、 texts を書き込む
  sheet.getRange(sheet.getLastRow() + 1, 1, texts.length, texts[0].length).setValues(texts); // 書き込み
}

// テスト
function test() {
  writeToLastCell("aaa bbb"); // 1
  writeToLastRange(["aaa", "bbb", "cccc"]); // 2
  writeToLastRanges([["ddd", "eee", "fff"], ["test 1", 2, 3]]); // 3
  // [["ddd", "eee", "fff"], ["test 1", 2, 3]]
  // [[ここと][ここ]...] の要素数を揃えないとエラーになります
}

スプレッドシートに書き込む上で必要になるものは、
1.書き込み先のスプレッドシート(スプレッドシートの ID)
2.書き込み先(シートの範囲)
3.書き込む内容

です。

1.書き込み先のスプレッドシートを開きます。
スプレッドシートの ID は、スプレッドシートを開いた時の URL の一部です。

今回だと
https://docs.google.com/spreadsheets/d/この部分/edit#gid=0
になります。

2.書き込み先を取得します。
リファレンスに慣れると便利です。
リファレンスによると、SpreadsheetApp.openById(SSID); は Spreadsheet クラスが返って来ます。
このクラスはスプレッドシート自体の名前や、各シートを管理するようなクラスです。
ということで、スプレッドシートを管理している Spreadsheet クラスから書き込みたい Sheet クラスを取り出します。
またまたリファレンスです。
Spreadsheet.getSheets() を利用することで、スプレッドシート内の Sheet を配列として全て取り出せます。
今回は Sheet が1つしかない無いので要素番号 0 を指定しています。
他にも名前や現在表示されているシートを取得する関数などもあります。
お好みで使い分けてください。
さて書き込み先の Sheet まで取得できました。
次は Sheet のどこ(行と列)に書き込むかを取得します。
今回は1列目の最後の行に書き込むようにしました。
・最終行の1列目に書き込む関数
・最終行に1行書き込む関数
・最終行に複数行書き込む関数
を用意しました。

3.書き込む内容
書き込む内容は書き込み先の取得の仕方によって変わります。
最終行の1列目に書き込む関数では、一つのセルに書き込むので String を引数に渡します。
最終行に1行書き込む関数では、最終行に複数列書き込むので [String, String, ...] (一次元配列)を引数に渡します。
最終行に複数行書き込む関数では、最終行から複数行に複数列書き込むので [[String, String, ...], [String, String, ...]] (二次元配列)を引数に渡します。
※この時、各行の配列(列)の要素数が等しくないとエラーになります。

結局のところ

1.用意されている SpreadsheetApp から Spreadsheet クラスを取得
2.Spreadsheet クラスから Sheet クラスを取得
3.Sheet クラスから書き込み範囲(Range クラス)を取得
4.Range クラスの範囲に沿った文字列 or 文字列配列 を用意
すれば大体どうにかなります。