うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Google Apps Script (GAS) を利用して Unity から POST する

公開されてない SpreadSheet を編集する際には認証が必要になり、ランタイムで更新するのは結構面倒になります

そのため、Google Apps Script (GAS) を利用して、お手軽にデータ更新を行う方法を記述します

今回はデータの追加・更新を行うため、GET ではなく POST を利用してデータ更新を行います

GAS

GAS で Post リクエストを受け取るためには doPostが必要になります

送った json を受け取って、json を返すだけの処理が以下になります

function doPost(e) {
  var params = JSON.parse(e.postData.getDataAsString());

  // 送信した json のパラメータを取得して Spread Sheet の編集処理を記述する
  params.***;

  // レスポンスをJsonで作成する
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ message: "Success" }));
  return output;
}

例えば以下の json を送った際に sheetName の値を取得するには params.sheetName にアクセスします

{ 
    sheetName : "Hoge"
}

スクリプト

GAS を記述し「デプロイ」したあとに deployId を取得して以下を呼び出すことで POST することができます

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
 
public class AppsScriptPost : MonoBehaviour
{
    public IEnumerator Request(string deployId, string json, Action<string> success, Action fail)
    {
        var url = $"https://script.google.com/macros/s/{deployId}/exec";
         
        var request = new UnityWebRequest(url, "POST");
        // Json追加
        var postData = Encoding.UTF8.GetBytes(json);
        request.uploadHandler = new UploadHandlerRaw(postData);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
         
        yield return request.SendWebRequest();
 
        if (request.result == UnityWebRequest.Result.Success)
        {
            success.Invoke(request.downloadHandler.text);   
        }
        else
        {
            fail.Invoke();
        }
    }
}