4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Googleカレンダー、カレンダーアプリにイベントを登録する JXA(JavaScript for Automation)

Last updated at Posted at 2020-02-19

きっかけ

 今、予定の登録は、バックアップを兼ねて iCloud のカレンダーと、Googleカレンダーの両方に記載していて、どちらかに先に書いて、コピペしていたけど、面倒なので両方に登録するスクリプトを書こうと思い立った。
 まず、慣れている AppleScript でと思って、AppleScript で Googleカレンダーに書く方法を検索してみたら、なんということでしょう。自分が過去に公開しているページが先頭に表示された。(すっかり忘れていました ^.^;;)

Googleカレンダー、カレンダーアプリにイベントを登録する AppleScript

 https://qiita.com/ynomura/items/2468ab782500938548e7

 ともあれ、これのおかげで AppleScript で動作するものが作れました。Qiitaは備忘録ですね。
そうこうして、スクリプトエディタを使っていて気がついたのが、このエディタは JavaScript にも対応しているということ。忘れている AppleScript の文法を検索すると、そのページには JavaScript の記法も書いてある。

湧き上がる好奇心

 気づいてしまうと、同じ機能を JavaScript でも書いてみたくなったというわけです。

つまづきの連続

 大概の所はなんとかなったのですが、やはり簡単にはいかなかった。

  • displayDialog (返り値の取得方法が文法のページに無かったので試行錯誤)
  • 指定のURLをブラウザーで開く方法 (window.open()などダメで試行錯誤)
  • date 関数は new Date() を使う
  • AppleのカレンダーアプリにEventを追加する (このサイトが参考になりました。)

スクリプトの説明

 私は、予定のところ(イベント名)に@を付けて場所も記載するようにしているので、location には何も入れるようになっていません。「イベント名@場所」と記載
 Googleと iCloud それぞれ登録するカレンダー名(ID)は冒頭に変数に直接セットしています。(自分の環境に合わせて直して使ってください)
 年も2020と固定値です。
月と日にちは一緒に「mmdd」と4桁で入力するようにしています。(時刻と分も同様に「hhmm」と)

JavaScript のソース

event2cal_javaScript.scpt
// イベントを Google カレンダーと、Appleのカレンダーアプリに登録する
// イベント名の後に@と場所を書く習慣があるので、カレンダーの「場所」には登録していない

var app = Application.currentApplication()
app.includeStandardAdditions = true

var GcalName = "<<登録するカレンダーI D>>@group.calendar.google.com"
var iCalName = "登録するカレンダー名"  // Apple のカレンダー名
var nen = "2020"		// 年は毎回入力が面倒なので、固定値にしている

var Summ = (app.displayDialog("イベント名@場所", {defaultAnswer: ""})).textReturned
var sYY = nen
var ans = (app.displayDialog("開始月日?(mmdd)", {defaultAnswer: ""})).textReturned
var sMM = ans.substr(0,2)
var sDD = ans.substr(2,2)
ans = (app.displayDialog("開始時分?(hhmm)", {defaultAnswer: ""})).textReturned
var sHH = ans.substr(0,2)
var sMin = ans.substr(2,2)
// 終了予定の年月日は開始予定と同じものを使うことにした
var eYY = sYY
var eMM = sMM
var eDD = sDD
ans = (app.displayDialog("終了時分?(hhmm)", {defaultAnswer: ""})).textReturned
var eHH = ans.substr(0,2)
var eMin = ans.substr(2,2)

// Googleカレンダーにイベントを登録する

var escSumm = encodeURIComponent(Summ)
var sDateTime = sYY + sMM + sDD + "T" + sHH + sMin + "00"
var eDateTime = eYY + eMM + eDD + "T" + eHH + eMin + "00"
var DateTime = sDateTime + "/" + eDateTime
ans = app.displayDialog(("Googleのカレンダーに「" + Summ + "" + DateTime + "を登録しますか?"), {
	buttons: ["しない", "する"],
	defaultButton: "する"
	})
if (ans.buttonReturned == "する") {
	var calURL =  "http://www.google.com/calendar/event?action=TEMPLATE&src=" + GcalName
	calURL = calURL + "&text=" + escSumm + "&dates=" + DateTime
	app.openLocation(calURL)
}

// iCalカレンダーにイベントを登録する
var sDate = new Date(sYY + "/" + sMM + "/" + sDD + " " + sHH + ":" + sMin + ":00")
var eDate = new Date(eYY + "/" + eMM + "/" + eDD + " " + eHH + ":" + eMin + ":00")
ans = app.displayDialog(("iCalのカレンダーに「" + Summ + "" + DateTime + "を登録しますか?"), {
	buttons: ["しない", "する"],
	defaultButton: "する"
	})
if (ans.buttonReturned == "する") {
	var iCal = Application("Calendar")
	iCal.activate()
	var Calendars = iCal.calendars.whose({name: iCalName})
	var Calendar = Calendars[0]
	var event = iCal.Event({summary: Summ, startDate: sDate, endDate: eDate})
	Calendar.events.push(event)
}

ご指導、コメント歓迎します。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?