2017年8月31日

GASでファイルを公開する


Googleドライブでファイルを公開する「ホスティング機能」が廃止されたので代替手段を探しました。


前回の作業で、 Google Apps Script でGoogleドライブにjsonファイルを保存するところまで行きました。このファイルを一般公開しウェブからアクセス(PHPあるいはJavascript)したいというのが希望です。

単純にファイルを一般を対象に共有すれば良いと考えたのですが、うまくいきません。調べてみると2016年にホスティング機能が廃止されたことがわかりました。現在でもファイルを公開することはできるのですがブラウザ経由になってしまうようです。

代替手段としてはGoogleは「Firebaseを使え」と言っています。 Firebaseはアンケート集計で少しだけ使ったことがあるので調べてみたのですが、ちょっと難しいことがわかりました。なぜかというと、操作端末にNode.jsをインストールする必要があるのですが、実際に使いたい端末には管理者権限が付与されていません。一度Firebaseの設定をしておけば後はノータッチで行ける、ということであれば何とかなるのですが、そういうわけにはいかないのです。

他の方法が無いか探っていると Google Apps Script の「ウェブアプリケーションとして導入」あるいは「実行可能APIとして導入」を使えば行けるのではないかと思いました。アクセスされたらスクリプトがファイルの中身を読み取って返せば良いのではないかと考えたのです。

APIの方がふさわしいと思いますが、APIはOAuth認証が必要ですので、ほんの少しレスポンスが悪いかもしれないと思ったのと、公開するのは誰に見られても問題のないファイルなので、とりあえず、より簡単そうなウェブアプリケーションとして公開することにしました。

ネットを検索してもやりたいことズバリは出てこないので試行錯誤しましたが、出来たものは非常にシンプルです(あえて冗長に書いてあります)。Blob形式で読み取ってText形式で返す簡単なものです。 DoGet() (あるいは doPost() )がアクセス時にまず実行される関数だそうです。


function doGet(){
  var folderId = 'フォルダーID';
  var fileName = 'ファイルネーム';
  var files = DriveApp.getFolderById(folderId).getFiles();
  while (files.hasNext()) {
    var file = files.next();
    if (file.getName() == fileName) {
      var json = file.getBlob();
      var jsonData = json.getDataAsString()
      return ContentService.createTextOutput(jsonData).setMimeType(ContentService.MimeType.JSON);
    }
  }
}

これを「ウェブアプリケーションとして導入」します。紛らわしいですが「最新のコード」がテスト用で、本番用公開URLはその上にあるテキストボックスのURLです。


私が躓いたのが「プロジェクトバージョン」です。スクリプトを修正して公開し直しても修正が反映されず、「何でかな~」と悩んだのですが、プロジェクトバージョンを変えないと公開用には反映されないようです。修正しても運用に支障がないようにバージョン管理されているそうです。知識もなくネットで検索しながら一人で作業していると、つまらないことで一々時間を使います。

とりあえず目的は達しましたが、問題はレスポンスですね。やはりちょっと遅いです。引き続き代替手段を探っていこうと思います。



0 件のコメント:

コメントを投稿