Google Docs では Google Apps Script を使ってマクロを組むことができる。GDD2011 の DevQuiz には、Google Apps Script に関する課題も出た。久しぶりに Google Docs をいじっていて、そういえばこの課題を解いたんだったな... と思い出したので、ここに載せてみる。
課題
ある都市(複数)における日別の供給電力と最大消費電力に関する記録が以下のような JSON の形式で与えられます。 この記録を Google SpreadSheets 上に展開してください。
[ { "city_name": "Oykot", "data": [ { "capacity": 1000, "usage": 750, }, { "capacity": 1200, "usage": 1000, }, ... ] }, { "city_name": "Akaso", "data": [ { "capacity": 1000, "usage": 800, }, ... ] }, ... ]
ぼくの回答
回答は以下の通り。これで、課題を満たしたスプレッド・シートを得た。
function myFunction() { var url = "http://gdd-2011-quiz-japan.appspot.com/apps_script/data?param=1093922241762506067"; var result = UrlFetchApp.fetch(url); var json = Utilities.jsonParse(result.getContentText()); var doc = SpreadsheetApp.getActiveSpreadsheet(); var sheets = doc.getSheets(); for (var i in json) { var sheet = doc.insertSheet(json[i].city_name, i); var table = new Array(); var table_size = 0; for (var j in json[i].data) { var d = new Array(json[i].data[j].capacity, json[i].data[j].usage); table.push(d); table_size++; } sheet.getRange(1,1,table_size,2).setValues(table); for (var j=0; j>table_size; j++) { var n = j+1; sheet.getRange("C"+n+":C"+n).setFormula("= B"+n+" / A"+n); } sheet.getRange("C1:C"+table_size).setNumberFormat("0.00%"); } logData(json); } function logData(json) { Logger.log("usage: " + json[0].data[0].usage); Logger.log("capacity: " + json[0].data[0].capacity); for (var i in json) { Logger.log(i + ": " + json[i].city_name); } } function getFormatString() { var doc = SpreadsheetApp.getActiveSpreadsheet(); var sheet = doc.getActiveSheet(); var string = sheet.getRange("C1:C1").getNumberFormat(); Logger.log("% = " + string); } function removeSheets() { SpreadsheetApp.getActiveSpreadsheet().deleteActiveSheet(); }
あとがき
GDD2011 の DevQuiz には Go 言語の課題にかかりっきりになって、結局解けなかった。諦めて Google Apps Script の課題に挑んだら、二時間ちょっとで出来てしまった。当然、Google Apps Script を触るのは初めて。意外と簡単に使えるので、ちょっと閑な時に勉強しておいて損はないと思う。
ちなみに、この回答。提出しようとしたら 1 分遅れで回答が締め切られていた。これを提出できてたら、あるいは GDD2011 に参加できたかも。。。いや、やっぱり無理だったかな。