きっかけ
今、予定の登録は、バックアップを兼ねて 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 のソース
// イベントを 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)
}
ご指導、コメント歓迎します。