We are ACORN!

プログラムやサーバーの設定など、技術的な記事を載せております。

Javascript プログラミング

Google Apps Script でWebAPIを作ろう

投稿日:2019-01-27 更新日:

Google Apps Scriptを使うと簡単にWeb APIを作ることが出来ます。

準備

まず、Google Drive上からApps Scriptを作れるようにしましょう。
ドライブの左上の「新規」ボタンを押すとメニューが開くので、「アプリを追加」

アプリの追加画面になりますので、右上の検索ボックスで「app script」と打ちます。
本当は、Apps Scriptなんですが、まあ気にしないでください。

一番上に、「Google Apps Script」が来ますので、「接続」を押します。

そうすると、接続が完了します。

そして、ドライブの新規のメニューに「Google Apps Script」が表示されるようになります。

早速作ってみよう

ドライブの新規からGoogle Apps Scriptをクリックすると、「無題のプロジェクト」が開きます。
適当に名前を付けてください。日本語でOKです。

ここでは、西暦から和暦に変換するWeb APIを作ってみましょう。
ちょっと長いです。

var $GENGOLIST = [
  {name: '令和', name_short: 'R', timestamp: '2019-05-01'},
  {name: '平成', name_short: 'H', timestamp: '1989-01-08'},
  {name: '昭和', name_short: 'S', timestamp: '1926-12-25'},
  {name: '大正', name_short: 'T', timestamp: '1912-07-30'},
  {name: '明治', name_short: 'M', timestamp: '1868-01-25'}
];

function doGet(e) {
  if (!e.parameter.y || !e.parameter.m || !e.parameter.d) {
    return createContent(
      e.parameter.callback,
      {result: false, response: 'パラメーターがセットされていません。'}
    );
  }
  var y = e.parameter.y;
  var m = e.parameter.m;
  var d = e.parameter.d;
  
  var n = new Date();
  if (y < 1868 || y > n.getFullYear()) {
    return createContent(
      e.parameter.callback,
      {result: false, response: 'yの範囲が正しくありません(1868〜現在年)'}
    );
  }
  if (m < 1 || m > 12) {
    return createContent(
      e.parameter.callback,
      {result: false, response: 'mの範囲が正しくありません(1〜12)'}
    );
  }
  if (d < 1 || d > 31) {
    return createContent(
      e.parameter.callback,
      {result: false, response: 'dの範囲が正しくありません(1〜31)'}
    );
  }
  
  var t = new Date(y, m-1, d);
  var i = 0;
  var r;
  var ry = 0;
  var tt;
  while(r = $GENGOLIST[i++]) {
    
    ra = r.timestamp.split('-');
    tt = new Date(ra[0],ra[1]-1,ra[2]);
    
    if (t >= tt) {
      ry = t.getFullYear() - tt.getFullYear() + 1;
      if (ry == 1) {
        ry = '元';
      }
      ry = r.name + ry;
      break;
    }
  }
  if (ry === 0) {
    return createContent(
      e.parameter.callback,
      {result: false, response: '範囲が正しくありません(1968-01-25〜現在)'}
    );
  }
  return createContent(
    e.parameter.callback,
    {result: true, response: ry + '年' + (t.getMonth()+1) + '月' + t.getDate() + '日'}
  );
}

//JSONまたはJSONPの文字列を返します
function createContent(callback , obj ) {
  if(callback) {
    return ContentService.createTextOutput(
      callback + '(' + JSON.stringify(obj) + ')'
    ).setMimeType(ContentService.MimeType.JAVASCRIPT);
  }
  else {
    return ContentService.createTextOutput(
      JSON.stringify(obj)
    ).setMimeType(ContentService.MimeType.JSON);
  }  
}

doGet(e)という関数が、Web APIのGETで実装になります。
e.parameterというオブジェクトがURLのパラメータの値を保持しています。
aaa?y=1988&m=4&d=22のようにアクセスされたとき、

e.parameter.y // 1998
e.parameter.m // 4
e.parameter.d // 22

という風に入ってきます。
また、JSONPにも対応するために、callbackというコールバック関数用のフィールドも持てるようになっています。

JSONなどの出力を返したいときは、

return ContentService.createTextOutput('JSON文字列').ContentService.MimeType.JSON;

doGetのreturnをしてやれば、JSONで返します。JSONPの時はMimeTypeがJAVASCRIPTになります。

これだとデバッグがしにくいので、最初はcreateContentは、

function createContent(callback , obj ) {
  Logger.log(obj);
  return '';
}

などとします。

テストを実行する関数を作ってこの関数を実行するようにします。

function myScript() {
  var e = {
    parameter: {
      y: 1988,
      m: 4,
      d: 22
    }
  };
  doGet(e);
}

こうすると、実行後、Ctrl+Enterでログが確認できます。

デプロイ

「公開」メニューから「ウェブアプリケーションとして導入」を選びます。

開いたダイアログで下記のように入力します。
「次のユーザーとしてアプリケーションを実行」必ず「自分」を選んでください。
「アプリケーションにアクセスできるユーザー」は「全員(匿名ユーザーを含む)」を選んでください。
「次のユーザーとしてアプリケーションを実行」を自分にしないと、「アプリケーションにアクセスできるユーザー」に匿名ユーザーが現れません。ご注意ください。

すると、「現在のウェブ アプリケーションのURL」というのが出ますので、これをコピーしておきます。

実際に利用する

phpですと、

$y = 1988;
$m = 4;
$d = 22;
$json = file_get_contents('[現在のウェブ アプリケーションのURL]?y=' . $y .
  '&m=' . $m . '&d=' . $d;
$data = json_decode($json);
print_r($data);
// 出力はこのようになります。
// stdClass Object
// (
//    [result] => 1
//    [response] => 昭和63年4月22日
//)

のように使います。[現在のウェブ アプリケーションのURL]は先ほどコピーしたURLです。

簡単にWeb APIが実装&実行できてしまいます。
お手軽な世の中ですね。

-Javascript, プログラミング


comment

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

【HTML5】 FormDataオブジェクトがログに出力されない(出力方法追記)

どうも仕様みたいですね。 どうやっても、無理でした。 隠ぺいされたオブジェクトっていうのも気持ち悪いですね。 それをajaxで送る、っていうのも気持ち悪い。 var fd = new FormData …

Google Bookmarksを利用するChrome拡張機能

暇なときにGoogle Bookmarksを利用するプラグインを作ってみました。 最低限のことしか出来ないのですが、自分で使う分にはこれで必要十分です。 Gブックマーク もしよろしかったら使ってみてく …

【PHP】WSL vs. Docker vs. Win32 環境別速度

PHPが複数環境で実行できるようになったので、速度を測定してみました。 マシンスペックは マシン Lenovo Thinkpad E460 プロセッサ Core i5-6200U @ 2.40GHz …

PHP Toolkit のSoapClientが接続できない

クライアントがPHPのバージョンを5.4から5.6にアップデートしたそうです。 (そういう時は前もって連絡ください(怒)) その際、エラーが出るというのです。 ログを見ると、 SoapClientの_ …

WordPressのメインループ&サブループ

WordPressのテンプレートを作っていると、ループの構造で混乱してくる人がいます。 ですので、不要なHTMLを除いた、単純な構造を書いておこうと思います。 解説はコメントに書いています。 < …