白牙隊A2屯所

びゃくがたいあにぃとんしょ

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

スプレッドシートからGoogleカレンダーへ予定を一括登録する

2014-06-30 | パソコン
GoogleカレンダーにはUTF-8のCSVファイルで予定を一括登録する機能がありますが、この「UTF-8のCSVファイルを作成」というのが意外に面倒です。
そこで、Google Apps Script の勉強もかねて、スプレッドシートから一括登録するスクリプトを作成してみました。
・・・結局、データベース的な表は作らなくちゃダメなんですけどねヽ( ´ー`)ノ

自分用という事で少し用途を絞りまして、終日の予定として「日付」と「タイトル」と「説明」を入力出来る様にしてみました。

A1セルから始めていただいて、1行目に項目、2行目以降にデータを記載。
項目の順番は変えても大丈夫ですが、名称は「日付」「タイトル」「説明」と記述する必要があります。

メニューに「カレンダーへ追加」というのを追加してみましたので、そちらから「終日予定登録」を選択すると関数が実行されて、表に記載した内容が一括登録されます。

配列にオブジェクトを並べる



今回は色気を出しまして、データベースの値をJSONにしてみる、というのをマネしてみました。

Google Apps Script で spreadsheet のデータを JSON として読み込む - プログラマってこんなかんじ??
Android アプリに限らず、JSON データを表示するようなアプリって作ること多いですよね。で、自分はその時いつもサーバサイド作るのがめんどくさくなっちゃう。なので、spreadsheet のデータをそのまま JSON として返すようなサーバーサイドアプリを GAS(Google Apps Script) で書いてみま...


今回はただ順番にカレンダーへ登録するだけなので別に必要ないかなぁとも思いますが、引用したサイトの様にJSON化できると色々広がりそうですよね。

このdai4649氏のスクリプトは初めみた際何がなんだかよくわかりませんでした。正直なところ。

オブジェクトの名前[キーが入った変数[j]] = データが入った変数[j]


という記述のループでJSON化されているのに気づいた際の感動たるや!ヽ( ´ー`)ノ

・・・カッコイイ・・・。自分では絶対思いつかない書き方です。

恐らくですが、タイトル部分とデータ部分を行ごとに別々に配列としておき、タイトルの個数分繰り返して頭から少しずつオブジェクト化、それらの塊をまた配列にしている・・・ってことなんじゃないかなぁ(自信ありませんが)

このdai4649氏のJSON化のところをコピペさせていただき、その後ろにGoogleカレンダーへ予定を登録するスクリプトを加えました。

(JSON化したはいいが、値を取り出す知識が足りずに苦戦したのは内緒ですσ(^_^;))

スプレッドシートのメニューから関数を実行する



今回はそれに加えて、操作がわかりやすい様に、スプレッドシートのメニューに関数実行を埋め込んでみました。

これはおなじみの掌田津耶乃氏のスクリプトのコピペです。

仕組みとしては、
「スプレッドシートを開いた際に実行される関数にメニュー追加の命令を実行させる」
という感じでしょうか。これで、あたかも初期からあるメニューの様に見えますので、慣れていない方が操作する際もあまり迷わない・・・かな?
(一応、パソコン詳しくない方でも出来る様にという趣旨です。)

スクリプトの実行とイベントハンドラ(5/5):初心者のためのGoogle Apps Scriptプログラミング入門
Googleドキュメントのスプレッドシートでは、メニューバーをスクリプトでカスタマイズすることができます。独自のメニューを追加し、そこからスクリプトを呼び出すように設定することが可能なのです。これを...


念の為のdoGet関数でiPhone用起動URLも



以前書いた様に、今回もウェブアプリケーションとしてURLを取得してみました。

その際はスプレッドシートは開いた状態でスクリプトが動くわけではないので
スプレッドシートをURLで指定する「SpreadsheetApp.openByUrl」を使用しています。
ここで言う、URLというのは、スプレッドシートシートをブラウザで開いた際のあの長ったらしいURLですね。

var URL_BOOK = 'https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0';
var SHEET_NAME = 'カレンダー登録';
function doGet(e) {
var url = URL_BOOK;
var sheetName = SHEET_NAME;
var book = SpreadsheetApp.openByUrl(url);
var sheet = book.getSheetByName(sheetName);
// {hoge : 'fuga'};
var json = convertSheet2JsonText(sheet);
//return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
return ContentService.createTextOutput('「終日予定登録」を実行しました。');
}
function onOpen(e){
var arr = [
{name: "終日予定登録", functionName: "convertSheet2JsonText"}
];
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
spreadsheet.addMenu("カレンダーへ追加", arr);
}
function convertSheet2JsonText(sheet) {
var url = URL_BOOK;
var sheetName = SHEET_NAME;
var book = SpreadsheetApp.openByUrl(url);
var sheet = book.getSheetByName(sheetName);
// first line(title)
var colStartIndex = 1;
var rowNum = 1;
var firstRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
var firstRowValues = firstRange.getValues();
var titleColumns = firstRowValues[0];
Logger.log("titleColumns = "+titleColumns);
// after the second line(data)
var lastRow = sheet.getLastRow();
var rowValues = [];
for(var rowIndex=2; rowIndex<=lastRow; rowIndex++) {
var colStartIndex = 1;
var rowNum = 1;
var range = sheet.getRange(rowIndex, colStartIndex, rowNum, sheet.getLastColumn());
var values = range.getValues();
Logger.log("values = "+values);
rowValues.push(values[0]);
Logger.log("rowValues = "+rowValues);
}
// create json
var jsonArray = [];
for(var i=0; i < rowValues.length; i++) {
var line = rowValues[i];
var json = new Object();
for(var j=0; j < titleColumns.length; j++) {
json[titleColumns[j]] = line[j];
Logger.log('titleColumns[j]='+json[titleColumns[j]]);
Logger.log("JSON = "+JSON.stringify(json));
}
jsonArray.push(json);
var logg = "日付→" + jsonArray[i].日付 + "題名→" + jsonArray[i].タイトル + "説明→" + jsonArray[i].説明;
Logger.log(logg);
}
//カレンダー操作
var calsheet = book.getSheetByName("カレンダー名");
var calName = calsheet.getRange(2,1).getValue();
var cals = CalendarApp.getCalendarsByName(calName);
var cal = cals[0];
for(var i=0; i < rowValues.length; i++) {
var body = jsonArray[i].説明;
var str = jsonArray[i].タイトル;
var dd = jsonArray[i].日付;
cal.createAllDayEvent(str, dd,{description: body});
};
return jsonArray;
}</pre>

複数シートからそのままカレンダーへ



恐らく、「一括で予定を登録したい!」という際は頭からポチポチ予定を入力、というよりは他に元となる情報がある事が多いのではないでしょうか?(好きなチームの年間スケジュールが発表された、など)

そうした元データから加工や参照してデータベースを作成した後、従来のUTF-8のCSVファイルを使用する場合はそのシートだけを取り出して保存し直す必要がありました。

その手間を省けるのは結構よいのではないかな、と思います。編集中のスプレッドシート以外は見に行っていないスクリプトですので、複数シートがあっても問題ありません。

職場などで一括登録したい予定に何か決まったフォーマットがあるのであれば、それ様にチューニングするってのもありですね。
それを別シートに貼り付けて参照からデータベース化する、とか。

また、カレンダーに関しても今回は「説明」を登録しましたが、その他にも場所や参加ユーザーに関するパラメータも用意されていますし、もちろん終日ではなく開始と終了の時間を指定してスクリプトを書く事も出来ますので、気になった方はリファレンスのページをご覧になってみてはいかがでしょうか?


Class Calendar - Google Apps Script ? Google Developers


UTF-8のCSVファイルで登録したい方はこちらがわかりやすいですよー。

Excelで作ったスケジュールをGoogleカレンダーに一括登録する ― 阪神タイガース2013年の試合日程など | ちょっとした人だかり - Part 2

参考にしたサイト
JavaScriptで覚えておくとよいデータ構造 - 配列・オブジェクト - いろいろ解析日記



ジャンル:
ウェブログ
コメント (2)   この記事についてブログを書く
この記事をはてなブックマークに追加
« 2014#19vs富山 2-1 「砂川のF... | トップ | GoogleドキュメントにURLから... »
最近の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
id:dai4649 です。コードわかりにくかったですよね^^; (dai4649)
2014-08-21 10:47:59
id:dai4649 です。コードわかりにくかったですよね^^;

カレンダー関係は自分もよくいじるので、参考にさせていただきます!gasは本当に便利ですねーー
うわ!dai4649さん! (A2)
2014-08-24 08:41:45
うわ!dai4649さん!
コメント気づかず申し訳ありません。いえいえ、素晴らしいスクリプトです。わからなかったのは私側の技術の問題です。
何度も繰り返し読んで、ようやくわかった時のあの感動!
素晴らしいスクリプトですよ。
何度も真似させていただいています。ありがとうございます。

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。
  • 30日以上前の記事に対するトラックバックは受け取らないよう設定されております。
  • 送信元の記事内容が半角英数のみのトラックバックは受け取らないよう設定されております。
  • このブログへのリンクがない記事からのトラックバックは受け取らないよう設定されております。
  • ※ブログ管理者のみ、編集画面で設定の変更が可能です。