趣味でバイクに乗り出してから、給油と走行距離情報をGoogleフォームを使って記録してたりします。 記録している項目は、給油した日付や給油量、金額、ガソリンスタンドの種類と場所、そして走行距離。

節約とかそういう目的がある訳ではなく、数値があると計測したくなる、くらいのライトな動機からはじめました。

で、この情報を使って区間燃費や月間燃費を出してグラフ化してみると季節性の変化なんかが見えてきて楽しいんですが、ちまちま手で更新するのが面倒になったので、GoogleAppsScriptを使って、フォーム送信をトリガーに自動でこれらの情報が更新されるようにしてみた。

素のJSがつらかったので、Underscore.jsなりlodashなり使えないか探したら、ありましたUnderscoreGS

Underscore.jsの完全な互換という訳ではないですが、Underscore.jsにあるいろいろなメソッドが使えます。

コードはこちら。

var 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使う旨味のないコードだなぁ。。ま、頻繁に手を入れるものでもないので、これにて書き捨て。