Keynoteの最前面の書類の現在選択中のスライド(ページ)に、指定月の日曜日はじまりカレンダーを、表オブジェクトで作成するAppleScriptです。
Keynoteで資料を作成していると、資料にカレンダーを入れたいケースが多々あります。Terminal.appを起動してcalコマンドでカレンダーを作ってみたり、Dashboardのカレンダーをコピーして入れることも多いですが、Dashboardはもうあるんだかないんだ分からない状態。かわりのものを用意してみました。
あとは、サイズやスタイル、土日のデータを削除するなど用途に応じて編集して表カレンダーを利用するとよいでしょう。
macOS標準装備のスクリプトメニューに入れて呼び出す場合には、アプリケーション形式で書き出したものを使う必要があります。
世の中のカレンダーは日曜日はじまりだけではないので、月曜日はじまりなど、その国、その現場ごとのルールに合わせて変更することが重要です。曜日名についても、実行中のユーザーの言語環境から取得して入れることも可能なので、そのようにしてもよいでしょう。
同じぐらいのスペックのマシンで本Scriptを動かすと、macOS 10.14, Mojave上では10.12.6上の(Keynote v8.1の)倍ぐらい速くて驚かされます。10.13.6上でも同様なのでOS側の対応というよりは、Keynote側のバージョンアップ(v8.1 –> v8.3)によるものかもしれません。
AppleScript名:指定月の日曜日はじまりカレンダーを表で作成 v2.scptd |
— Created 2019-02-14 by Takaaki Naganoya use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" property theDate : missing value property daysList : {"日", "月", "火", "水", "木", "金", "土"} –Japanese –property daysList : {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}–English set paramObj to {myMessage:"月選択", mySubMessage:"作成対象の月を選択してください。日付はどれでもけっこうです。"} set {targYear, targMonth} to chooseMonth(paramObj) of me –指定月のカレンダーを1D List(7 days x 6 weeks) で作成 set aCalList to retListCalendar(targYear, targMonth) of me set fullCalList to daysList & aCalList set aTitle to (targYear as string) & (targMonth as string) set dCount to 1 tell application "Keynote" tell front document tell current slide set aTable to make new table with properties {header column count:0, header row count:1, row count:7, column count:7, name:aTitle} tell aTable repeat with i from 1 to 49 tell cell i ignoring application responses set value to contents of item dCount of fullCalList end ignoring end tell set dCount to dCount + 1 end repeat end tell end tell end tell end tell –カレンダー作成対象の年、月を選択(ただし、日付をクリックして選択しないと値を取得できないので注意) on chooseMonth(paramObj) my performSelectorOnMainThread:"chooseDate:" withObject:(paramObj) waitUntilDone:true set aYear to year of theDate set aMonth to month of theDate as number return {aYear, aMonth} end chooseMonth on chooseDate:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj — create a view set theView to current application’s NSView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 100, 200)) set datePicker to current application’s NSDatePicker’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 100, 100)) datePicker’s setDatePickerStyle:(current application’s NSClockAndCalendarDatePickerStyle) datePicker’s setDatePickerElements:((current application’s NSYearMonthDayDatePickerElementFlag) + (current application’s NSHourMinuteSecondDatePickerElementFlag as integer)) datePicker’s setDateValue:(current application’s NSDate’s |date|()) set theSize to datePicker’s fittingSize() theView’s setFrameSize:theSize datePicker’s setFrameSize:theSize theView’s setSubviews:{datePicker} set theAlert to current application’s NSAlert’s alloc()’s init() — set up alert tell theAlert its setMessageText:aMainMes its setInformativeText:aSubMes its addButtonWithTitle:"OK" its addButtonWithTitle:"Cancel" its setAccessoryView:theView end tell — show alert in modal loop set returnCode to theAlert’s runModal() if returnCode = (current application’s NSAlertSecondButtonReturn) then error number -128 — retrieve date set (my theDate) to (datePicker’s dateValue()) as date end chooseDate: –指定月のカレンダーを1D List(7 days x 6 weeks) で返す on retListCalendar(tYear, tMonth) set mLen to getMlen(tYear, tMonth) of me set aList to {} set fDat to getDateInternational(tYear, tMonth, 1) of me tell current application set aOffset to (weekday of fDat) as number end tell –header gap repeat (aOffset – 1) times set the end of aList to "" end repeat –calendar body repeat with i from 1 to mLen set the end of aList to (i as string) end repeat –footer gap repeat (42 – aOffset – mLen + 1) times set the end of aList to "" end repeat return aList end retListCalendar –現在のカレンダーで指定年月の日数を返す(国際化対応版) on getMlen(aYear as integer, aMonth as integer) set theNSCalendar to current application’s NSCalendar’s currentCalendar() set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:1 hour:0 minute:0 |second|:0 nanosecond:0 set theResult to theNSCalendar’s rangeOfUnit:(current application’s NSDayCalendarUnit) inUnit:(current application’s NSMonthCalendarUnit) forDate:theDate return |length| of theResult end getMlen –現在のカレンダーで指定年月のdate objectを返す on getDateInternational(aYear, aMonth, aDay) set theNSCalendar to current application’s NSCalendar’s currentCalendar() set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:0 minute:0 |second|:0 nanosecond:0 return theDate as date end getDateInternational |