GoogleAppsScript
- GoogleAppsScriptでGoogleフォームの集計を自動化する。ついでにUnderscoreGS。 (14 Jul 2016 | Tags:
GoogleAppsScriptでGoogleフォームの集計を自動化する。ついでにUnderscoreGS。 GoogleAppsScriptでGoogleフォームの集計を自動化する。ついでにUnderscoreGS。
趣味でバイクに乗り出してから、給油と走行距離情報をGoogleフォームを使って記録してたりします。 記録している項目は、給油した日付や給油量、金額、ガソリンスタンドの種類と場所、そして走行距離。
節約とかそういう目的がある訳ではなく、数値があると計測したくなる、くらいのライトな動機からはじめました。
で、この情報を使って区間燃費や月間燃費を出してグラフ化してみると季節性の変化なんかが見えてきて楽しいんですが、ちまちま手で更新するのが面倒になったので、GoogleAppsScriptを使って、フォーム送信をトリガーに自動でこれらの情報が更新されるようにしてみた。
素のJSがつらかったので、Underscore.jsなりlodashなり使えないか探したら、ありましたUnderscoreGS。
Underscore.jsの完全な互換という訳ではないですが、Underscore.jsにあるいろいろなメソッドが使えます。
コードはこちら。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersvar refuelingDateCol = 2; var distanceCol = 3; var oilingQuantityCol = 4; var feeCol = 5; var groupingMonthCol = 5; var groupingDistanceCol = 6; var groupingFuelConsumptionCol = 7; var mySheetURL = 'http://your/form/url' function myFunction() { var spreadSheet = SpreadsheetApp.openByUrl(mySheetURL); var sheet = spreadSheet.getSheets()[0]; var lastRow = sheet.getLastRow(); var dataCount = lastRow-1; var list = new Array(); var consumptionList = new Array(); var targetSheet = spreadSheet.getSheets()[1]; for(i=2;i<lastRow+1;i++) { list.push({ "date":sheet.getRange(i, refuelingDateCol).getValue(), "distance":sheet.getRange(i, distanceCol).getValue(), "quantity":sheet.getRange(i, oilingQuantityCol).getValue()}); } var i = 1; // Record fuel consumption per distance. UnderscoreGS._each(UnderscoreGS._tail(list), function(d) { var date = d.date; var fuel = d.quantity; var distance = d.distance - list[i-1].distance; var fuelConsumption = distance/fuel; targetSheet.getRange(i, 1).setValue(date); targetSheet.getRange(i, 2).setValue(distance); targetSheet.getRange(i, 3).setValue(fuelConsumption); consumptionList.push({ "date":date, "distance":distance, "fuel":fuel }); i++; }, this); var group = new Object(); UnderscoreGS._each(consumptionList, function(d){ var yyyyMM = Utilities.formatDate( d.date, 'JST', 'yyyyMM'); if(UnderscoreGS._isEmpty(group[yyyyMM])) { group[yyyyMM] = new Array(); } group[yyyyMM].push(d); }, this); var gi = 1; // Record fuel consumption per month. UnderscoreGS._each(group, function(a){ var date = Utilities.formatDate( a[0].date, 'JST', 'yyyy年M月'); var distance = 0; var fuel = 0; UnderscoreGS._each(a, function(b){ distance += b.distance; fuel += b.fuel; }, this); targetSheet.getRange(gi, groupingMonthCol).setValue(date); targetSheet.getRange(gi, groupingDistanceCol).setValue(distance); targetSheet.getRange(gi, groupingFuelConsumptionCol).setValue(distance/fuel); gi++; }, this); } あんまりUnderscoreGS使う旨味のないコードだなぁ。。ま、頻繁に手を入れるものでもないので、これにて書き捨て。
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
Jekyll::Drops::SiteDrop