Help us understand the problem. What is going on with this article?

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

きっかけ

 今、予定の登録は、バックアップを兼ねて 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)
}

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした