Skip to content

Instantly share code, notes, and snippets.

@fukata
Created October 22, 2011 17:29
Show Gist options
  • Save fukata/1306251 to your computer and use it in GitHub Desktop.
Save fukata/1306251 to your computer and use it in GitHub Desktop.
Weight Chart at Google Calendar
/**
* Return calendar for weight.
* @return Calendar
*/
function getWeightCal() {
var id = 'YOUR GOOGLE CALENDAR ID';
var cal = CalendarApp.getOwnedCalendarById(id);
return cal;
}
/**
* Return start time.
* @return Date
*/
function getStartTime(date) {
if (date) return date;
date = new Date();
date.setMonth(date.getMonth() - 1);
return date;
}
/**
* Return end time.
* @return Date
*/
function getEndTime(date) {
if (date) return date;
return new Date();
}
/**
* @param Date startTime
* @param Date endTime
* @return boolean
*/
function invalidTime(startTime, endTime) {
Logger.log("startTime: " + startTime + ", endTime: " + endTime);
if (startTime.getTime() > endTime.getTime()) {
return true;
}
return false;
}
/**
* @param Date startTime
* @param Date endTime
* @param Array events
*/
function drawGraph(startTime, endTime, events) {
if (!events || events.length == 0) {
Browser.msgBox("データが1件もありません。データを登録してください。");
return;
}
var weightRe = new RegExp("([0-9]+(?:[0-9]+)?)");
var chartData = Charts.newDataTable()
.addColumn(Charts.ColumnType.STRING, "Date")
.addColumn(Charts.ColumnType.NUMBER, "Weight");
for (var i = 0; i < events.length; i++) {
var event = events[i];
var date = event.getStartTime();
var weight = false;
if (!event.getTitle().match(weightRe)) {
continue;
}
weight = parseFloat(RegExp.$1);
if (isNaN(weight)) {
continue;
}
Logger.log("Date: " + date + ", Weight: " + weight);
var d = date.getYear() + "/" + (date.getMonth()+1) + "/" + date.getDate();
chartData.addRow([d, weight]);
}
showApp(startTime, endTime, chartData);
}
/**
* @param Date startTime
* @param Date endTime
* @param DataTable chartData
*/
function showApp(startTime, endTime, chartData) {
var chart = Charts.newAreaChart()
.setDataTable(chartData.build())
.setStacked()
.setRange(0, 40)
.setTitle("Weight")
.build();
var app = UiApp.createApplication().setTitle("Weight");
var startTimeTextBox = app.createTextBox()
.setName('startTime').setId('startTime')
.setValue(startTime.getYear()+'/'+(startTime.getMonth()+1)+'/'+startTime.getDate());
app.add(startTimeTextBox);
var endTimeTextBox = app.createTextBox()
.setName('endTime').setId('endTime')
.setValue(endTime.getYear()+'/'+(endTime.getMonth()+1)+'/'+endTime.getDate());
app.add(endTimeTextBox);
var submitHandler = app.createServerClickHandler('handlerUpdateGraph')
.addCallbackElement(startTimeTextBox)
.addCallbackElement(endTimeTextBox);
var submitButton = app.createButton("Update", submitHandler);
app.add(submitButton);
app.add(chart);
var doc = SpreadsheetApp.getActive();
doc.show(app);
}
/**
* Click handler for update graph.
* @param Event e
*/
function handlerUpdateGraph(e) {
var dateRe = new RegExp("([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})");
var startTime = endTime = false;
Logger.log(e);
var st = e.parameter.startTime;
if (st && st.match(dateRe)) startTime = new Date(RegExp.$1, parseInt(RegExp.$2,10)-1, RegExp.$3);
var et = e.parameter.endTime;
if (et && et.match(dateRe)) endTime = new Date(RegExp.$1, parseInt(RegExp.$2,10)-1, RegExp.$3);
doUpdateGraph(startTime, endTime);
}
/**
* Execute udpate weight graph.
* @param Date startTime
*/
function doUpdateGraph(startTime, endTime) {
startTime = getStartTime(startTime);
endTime = getEndTime(endTime);
if (invalidTime(startTime, endTime)) {
Browser.msgBox("日付が不正です。");
return;
}
var cal = getWeightCal();
var events = cal.getEvents(startTime, endTime);
drawGraph(startTime, endTime, events);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment