Created
October 22, 2011 17:29
-
-
Save fukata/1306251 to your computer and use it in GitHub Desktop.
Weight Chart at Google Calendar
This file contains 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 characters
/** | |
* 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