View on GitHub

adventure-cube

スプレッドシートをJsonで受け取る

1. 新規のスプレッドシートを作成しましょう

Google Driveを開く→新規→新規スプレッドシート

2. スクリプトを記述しましょう

シート上部のツール→>スクリプトエディタを選択してください。
※Googleに複数のアカウントでログインしていた際、エラーになることがあるので注意してください。

以下のスクリプトを参考に記入してください。
Idは自分のシートのものを入力してください。
自分のプロジェクトに応用する際は、適宜修正してください。

function doGet(param) {
  var id = "[URLのd/のあとの文字列]";
  
  //シート名を指定してJsonを返す。シート名はリクエストの後ろに?shhet=xxxxの形で指定する。シート名が付与されていなかった場合、Cubeマスタを返す
  var sheetName = "Cube";
  if(param && param.parameter && param.parameter.sheet)
  {
    sheetName = param.parameter.sheet;
  }
  
  //シートを拾ってくる
  var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
  var rows = sheet.getDataRange().getValues();
  var keys = [];
  
  //データ開始行を検索する。B列が空欄の場所はコメントや説明行になる。
  //データ開始行は、Jsonのキーになる。
  var index = 0;
  for(index=0; index<rows.length; ++index)
  {
    if(rows[index][1] == "") continue;
    keys = rows[index];
    break;
  };
  
  //1行目のF列にバージョンが入っているので取得する
  var version = rows[0][5];
  
  //キー列のあと、データ列だけを切り出す
  rows.splice(0, index+1);
  var datum = rows.map(function(row) {
    var obj = {};
    row.map(function(item, index) {
      if(String(keys[index]) == "") return;
      if(String(keys[index]).indexOf("_") == 0) return;
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
  
  //バージョン情報を付ける感じで成形
  var json = {
    Version: version,
    Data: datum
  };
  
  //jsonデータを文字列にして返す
  return ContentService.createTextOutput(JSON.stringify(json, null, 2))
  .setMimeType(ContentService.MimeType.JSON);
}

3. Web Appとして公開する

スクリプトエディタのメニューから、
公開→ウェブアプリケーションとして導入を選択してください。

以下の設定の部分を変更してください。

変更したら更新を押します。

4. スクリプトを修正した場合

スクリプトエディタのメニューから、再度、
公開→ウェブアプリケーションとして導入 を選択してください。

Project versionを「New」にして、更新ボタンを押します。

通信

型を気にせず受け取りたい場合

dynamicと、Utf8Jsonというアセットを使います
※ほかのアセットでもいいですが、これが一番いいと思います。

UTF8Json
https://www.fast-system.jp/unity-utf8json-howto/
をプロジェクトにImportしてください。

Network.WebRequest.Request<Network.WebRequest.GetDynamic>("https://script.google.com/macros/s/AKfycbyc6WmX57vj8_V5tRL7eN4QCWMcLUQx8Jtu_B_JyqnMRGxH0Uk/exec?sheet=Cube", Network.WebRequest.ResultType.Json, (dynamic json) =>
{
  Debug.Log(json["Data"][0]["Id"]);
});

型を気にする場合

JsonUtilityを使ってクラスにします。

Network.WebRequest.Request<Network.WebRequest.GetString>("https://script.google.com/macros/s/AKfycbyc6WmX57vj8_V5tRL7eN4QCWMcLUQx8Jtu_B_JyqnMRGxH0Uk/exec?sheet=Cube", Network.WebRequest.ResultType.String, (string json) =>
{
    var data = JsonUtility.FromJson<MasterData.MasterDataClass<MasterData.Cube>>(json);
    Debug.Log(data.Data[0].Id);
});

参考文献

このあたりを参考にしています。

Google Spreadsheet のデータを JSON 形式で取得する Web API をサクッと作る
https://qiita.com/takatama/items/7aa1097aac453fff1d53

Googleスプレッドシートの中身を外部からAPIを使わずJSON形式で取得する方法
http://pineplanter.moo.jp/non-it-salaryman/2019/11/07/google-sp-json/

Google Sheets API v4を適当に叩いて適当にデータをJSONで取得する
https://taiki-t.hatenablog.com/entry/2016/10/14/031124