Googleスプレッドシートの内容を適当にJSONにする

10min..の関係で毎年駒場祭・五月祭の季節になるとやっているのだけど、毎回忘れて非効率極まりないのでメモっておく。

概要

  1. Google driveでスクリプトを作成
  2. 公開

Google driveでスクリプトを作成

昔はxlsでダウソ(死語)してPythonのxlrdとかで読んでたのだけど、こっちのほうが圧倒的に効率的。マイドライブ > 新規 > Google Apps Scriptでスクリプトを新規作成。なおスプレッドシートのファイルに紐づけて作ることもできるのだけど、ユーザーパーミッションの関係?でうまくいかない。多分ぼくがそのスプレッドシートの所有者じゃないから?かな。

スクリプトはこんな感じ。

function toJson(id, sheet) {
  var sheet = SpreadsheetApp.openById(id).getSheetByName(sheet);
  var rows = sheet.getDataRange().getValues();
  
  return rows.slice(1).filter(function(x) { return x[2]; }).map(
    function(x) {
      var keys = [{key: "name", id: 1}, {key: "affMajor", id: 4}, {key: "affMinor", id: 5}, {key: "title", id: 6}, {key: "abstract", id: 7}];
      var obj = {};
      
      for (var i = 0; i < keys.length; i++) {
        obj[keys[i].key] = x[keys[i].id];
      }
      
      return obj;
    }
  );
}

function doGet() {
  var data = toJson(__ID__HERE__, __SHEET_NAME__);
  return ContentService.createTextOutput("var data = " + JSON.stringify(data) + ";").setMimeType(ContentService.MimeType.JAVASCRIPT);
}

__ID__HERE__には、スプレッドシートのIDを入れる。IDはスプレッドシートURLがhttps://docs.google.com/spreadsheets/d/.../editなら...の部分。ホントはopenByURLでもいいんだけど。あと__SHEET_NAME__もシートの名前に置き換えておく。 あとsliceの引数とmapの中身も当然適当に変えておく。

追記

今回は結局Pythonスクリプトを書いた。トップレベルに_scriptsと、アンダースコアから始まるディレクトリを作るとその下のファイルはwebから見えないらしい。

公開

上メニューの実行 > doGetで実行し、表示 > 実行トランスクリプトとかで見てみてうまく行っていそうなら公開 > ウェブアプリケーションとして導入、から公開する。公開範囲は自分だけにしてもいいし、まあ10minのページから呼んでしまってもいい。ただ後者はたまにパーミッションがしくる?ことがあるのでやめたほうがいいと思う。なおもう一点注意点としては、スクリプトを編集したあとはバージョン番号をbumpしないと認識されない。

Comments

comments powered by Disqus