GASでDarkSouls3のアイテム名とフレーバーテキストをJSON形式でランダムに返すAPIを作ってみた

#目的
暇だったので、GASとWebAPIの復習がてら作ってみた。

#用意するもの
- Googleアカウント（Google Driveの機能を使ってサーバを立てるので）

#やったこと
##1.まずはGoogle Driveにログイン
ログインするだけなので手順は省きます。

##2.データの用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/01cbdbd0-50b1-69cc-5909-e0cf077a01ee.png)
ログイン後、上の画像の新規ボタンからGoogleスプレッドシートを選択。
テンプレートとかは特に決めず、空白のスプレッドシートにしました。

と、ここで困った...。
こんなこと誰もやってないので、まとまったデータが存在しないのであった...。

しょうがない、作りますか。
というわけでゲームを起動してから、とりあえず目についたアイテムとフレーバーテキストを丸写し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/989be0c5-9f65-92d4-b489-b7e28aef356b.png)

とりあえずこんなもんでいいでしょう。
列名はシンプルにアイテム名として"itemname"、フレーバーテキストとして"description"としてみました。

##3.コード
さて、データは揃ったのであとはサーバ側の話です。
サーバ立てる？いやいや、Google DriveにはGoogle Apps Scriptという超絶便利なものがあってですね。簡易FaaSみたいなもんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/01cbdbd0-50b1-69cc-5909-e0cf077a01ee.png)
今度は、上の画像の新規→その他→Google Apps Scriptを選択。
はじめての場合は、新規→その他→アプリの追加から「Google Apps Script」と検索し、「接続」をすると使えるようになります。もちろん無料。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/882e2689-a4f5-24d5-28c6-252105f1b8f2.png)
こんな感じになりますが、最初から書いてあるこの関数は不要なので消します。

書いたコードはこんな感じ。

```JS

//doGet関数が、GETでリクエストを受けとったときの挙動
function doGet() {
  /*
  getDataとgetRandomに渡している引数は、GoogleスプレッドシートのID
  IDは、スプレッドシートを開いてるときのURL部分にある
  例：https://docs.google.com/spreadsheets/d/ココ/edit#gid=0
  */
  var data = getData('1dKUUM_lHZxaPNcZi0zdnzF1O7Yq9iXL9_GWb7cvUKyk');
  var random = getRandom('1dKUUM_lHZxaPNcZi0zdnzF1O7Yq9iXL9_GWb7cvUKyk');
  
  return ContentService.createTextOutput(JSON.stringify(data[random], null, 2)).setMimeType(ContentService.MimeType.JSON);
}

//とりあえず、スプレッドシートから一括でデータをとってくる関数
function getData(sheetId) {
    
  var sheet = SpreadsheetApp.openById(sheetId);
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {};
    row.map(function(item, index) {
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
}

//シートの末尾までの行数をカウントし、そこまでの乱数を生成して返す関数
function getRandom(sheetId){
  
  var sheet = SpreadsheetApp.openById(sheetId);
  
  var columnBVals = sheet.getRange('B:B').getValues();
  var lastRow = columnBVals.filter(String).length;
  
  random = Math.floor(Math.random() * (lastRow - 1));
  return random;
}
```

設計もへったくれもありませんが、とりあえずこんな感じでできました。


##4.Webアプリとして公開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/aec1c2bf-570a-8dc9-5eb5-2d0777e8aaf4.png)
あとは公開からウェブアプリケーションとして導入をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/60ded322-2bd4-ba15-587d-bfba58478aa7.png)

出ているURLが、APIのエンドポイントになります。
あとで使うのでコピーしておきます。

コードを変えたときは、「プロジェクトバージョン」をNewにする必要があります。
「次のユーザとしてアプリケーションを実行」は「自分（メールアドレス）」を選択。
「アクセスできるユーザ」は「全員（匿名ユーザを含む）」を選択。
ここも、初めての場合は同意等を求められる場合があるようです。

おわったら、更新ボタンを押して終わりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/0a661327-ed61-7ecf-0a19-8d59ab5a9014.png)

できたー。

一応できたやつは<a href="https://script.googleusercontent.com/macros/echo?user_content_key=NFecXkcPaCbb0092o8jmwMwRcPqifsvP4dZxgJRp5Bozpt5SUCtgK3aFhPgZWjeZs6FDLN690IuixyiPjVOGicB-nQ8MKsUem5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnPS7sCq10B76mtsPzDvd1-9XPuEK6fzXS-D_SpxWzqkxK9sUhrfX36dpbtMpG70C3LqszQji3AcS&lib=M3pKAQTBXVaCfnp7OQInH3gqUYpKH-07x">こちら</a>。

GASは動作保証が無いらしい？ので、あんまり負荷かけすぎると良くないようです。