【コピペで完成】スプレッドシートを使ってAPIを作ってみよう!~ 実装編 ~

エンジニアの人、夢の中でもソースコード書きがち

こんばんは、やましょです。

前回の振り返り

前回はAPIを作成するための準備を行いました。

準備ができてない方はこちらを記事をご覧ください。

この記事を読んで分かること

  • コピペで動かせるソースコード
  • ソースコードの詳細

それでは実装をしていきましょう!!

実装する

1. スプレッドシートIDを確認

スプレッドシートのURLからIDを確認することができます!

https://docs.google.com/spreadsheets/d/{ スプレッドシートID }/edit#gid=0

URKが https://docs.google.com/spreadsheets/d/12345/edit#gid=0となっていた場合、IDは 12345となります。

2.ソースコードをコピペして、必要な情報を入力

// *************************
// ご自身が作成されたスプレッドシートの情報を記載してください↓
// *************************

// スプレッドシートのURLから取得する
const SHEET_ID = 'XXXXXXXXXXXXX';
// 対象のシート名。今回の例ではusers
const SHEET_NAME = 'users';

// *************************
// スプレッドシートの情報を取得
// *************************
function getSheetValues (spreadsheetId, sheet_name) {
  const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet_name);
  const rows = sheet.getDataRange().getValues();
  const keys = rows.splice(0, 1)[0];
  return { rows, keys };
}

// *************************
// スプレッドシートの内容からデータを取得
// *************************
function getObjects () {
  const { rows, keys } = getSheetValues(SHEET_ID, SHEET_NAME);

  const objects = [];
  rows.forEach(function (row)  {
    const object = {};
    row.forEach(function (column, index) {
      const key = keys[index];
      object[key] = column;
    });
    objects.push(object);
  });
  return objects;
}

// *************************
// APIのURLを叩いた時に実行される関数
// *************************
function doGet () {
  const objects = getObjects();
  return ContentService.createTextOutput(JSON.stringify(objects))
  .setMimeType(ContentService.MimeType.JSON);
}

プログラムの詳細を見ずに、とりあえず動かしたい方は、コピペして、必要な情報を入力して、デプロイしてみてください!

このように値を取得できたら完成です!

ソースコードの詳細を知りたい方は引き続きご覧ください。

実装内容詳細

1. スプレッドシートの情報を取得

getSheetValues()についてです。

対象のシートを取得

スプレッドシートのIDをもとに、スプレッドシートを取得し、シート名によりシートを取得します。

const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheet_name);

全てのデータを取得

const rows = sheet.getDataRange().getValues();

SpreadsheetクラスgetDataRange()メソッドを使うことで、データが存在する範囲を取得することができます。

そして、RangeクラスgetValues()メソッドを使うことで、範囲内のデータを全て配列形式で取得することができます。

rowsの値

キーを取得

取得したrowsには、現在nameageといったキーとなる値と、たろう18といった値が一緒になっているので、それを分割する処理を行います。

const keys = rows.splice(0, 1)[0];

JavaScriptのArray(配列)クラスのspliceメソッドを使用してます。

spliceは開始位置と削除する数を指定することで、対象の配列からそれらを削除し、戻り値として、削除した要素を含む配列を返します。

今回の場合、rowsの1番目(インデックスは0) の値がキーとなるので、1番目を削除します。

rowsの値
// rowsの0番目から1つの値を取り除く
const return = rows.splice(0, 1);

console.log(return); 
// 削除された要素の配列
//=>  [ ['name', 'age', 'description'] ]

console.log(rows);
// 0番目の値が削除されている
// => [ ['たろう', 18, 'いつも...'], ['はなこ', 16 ...] ]

そしてキーは、削除された配列の1番目に存在するので、 下記のコードでキーを取得することができます。

const keys = rows.splice(0, 1)[0];

これで、スプレッドシートからキーと値を取得することができました。

スプレッドシートから取得した値を整形する

getObjectについてです。

function getObjects () {
  // getSheetValuesからキーと値を取得
  const { rows, keys } = getSheetValues(SHEET_ID, SHEET_NAME);

  const objects = [];
  // 値の配列をeachする
  rows.forEach(function (row)  {
    const object = {};
    row.forEach(function (column, index) {
      const key = keys[index];
      object[key] = column;
    });
    objects.push(object);
  });
  return objects;
}

配列形式になっていた値を

JSON形式にしてます。

取得できた値を返す

doGetについてです。

ここまでで取得できたユーザの一覧のデータをJSON文字列に変換します。

そして、返却する型にJSONを指定します。

const objects = getObjects();
return ContentService.createTextOutput(JSON.stringify(objects))
.setMimeType(ContentService.MimeType.JSON);

これでAPIが完成となります!

最後に

無事に完成できましたでしょうか??

ソースコード内に console.logを追加して、値を確認してみると、それぞれどのような値になっているか分かるので、もっとくわしく知りたい方は試してみてください!

また、作成したAPIを使うサンプルアプリケーションを作成しましたので、使用例をみたい方はぜひご覧ください!

参考

スプレッドシート関連

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openbyidid

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetByName(String)

https://developers.google.com/apps-script/guides/content?hl=en#serving_json_from_scripts

JavaScript Array spliceメソッド

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice