Top > おぼえたこと > AppleScript編

インチキ占いスクリプト

●概要

起動すると、貴方の生年月日を聞いてきます。
生年月日を入力すると、貴方の生まれてからの日数と、占い結果を表示します。

まずは、スクリプトを書いてみたので、スクリプトエディタに入力して実行ボタンを押してみよう。

display dialog "貴方の今日の運勢を占ってしんぜよー!" & return & "あなたの生年月日を入力して下さい。" default answer "1984.1.24"

set bdStr to text returned of the result

set bdDate to date bdStr

set yourDays to ((current date) - bdDate) div days

set uranai to yourDays mod 4

if uranai = 0 then
 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、赤子のようなお肌!" & return & "あなたの運勢は大吉とでました。" buttons "おめでとーう!"
else if uranai = 1 then
 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、まだまだお若い!" & return & "あなたの運勢は吉とでました。" buttons "やったね!"
else if uranai = 2 then
 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、少しお疲れのような!" & return & "あなたの運勢は凶とでました。" buttons "ざんねーん!"
else
 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、あと何日もつやら!" & return & "あなたの運勢は大凶とでました。" buttons "おそろしや!"
end if

Download: インチキ占いスクリプト(Classic用)

どうですか?うまく行きましたか?
貴方の占いの結果は如何でした?

●スクリプト解説

さてと、と言う前にちょっと待って下さいョ!
命令はすべてtell application "○○"からend tellの間に書く事になっていたはずなんですが、ここではありませんね。

tell application "○○"
  命令文
end tell

実は、これを省略すると、AppleScript自身が選択される事になっています。

1行目のdisplay dialogやcurrentdateなどの命令文は、ファインダーが持っている命令ではなく、AppleScript自身やOSAXと言われるAppleScriptのプラグインのようなものの命令文なんです。

もしも、

tell application "Finder"
 display dialog "貴方の今日の運勢を占ってしんぜよー!" & return & "あなたの生年月日を入力して下さい。" default answer "1984.1.24"

 set bdStr to text returned of the result

 set bdDate to date bdStr
end tell

なんて書いちゃうと、“Finderでエラーが発生しました”なんてエラーメッセージが出てきたりします。

●display dialog

display dialog "貴方の今日の運勢を占ってしんぜよー!" & return & "あなたの生年月日を入力して下さい。" default answer "1984.1.24"
set bdStr to text returned of the result
set bdDate to date bdStr

はじめに出てきた命令文が“display dialog”でダイアログを出すための命令文だ。
オプションも色々あるので、説明しておこう。

display dialog questionString
  [ default answer answerString ]
  [ buttons buttonlist ]
  [ default button buttonNumberOrName ]
  [ with icon iconNumberOrName ]
  [ giving up after waitingSeconds ]

[]の中はオプションです。
あっても無くても構いません。
ピンク文字が引数です。

questionString ダイアログに表示する文字です。
255バイトまでの文字を表示できます。
例) display dialog "ハロー!"
answerString ユーザーにテキストを入力させる場合に使用します。
例) display dialog "お名前は?" default answer "名無しのゴンベ"
「名無しのゴンベ」はテキスト入力欄のデフォルト値になります。不必要な場合には、""としておいて下さい。
buttonlist ダイアログに出てくるボタンを指定します。
ボタンは最大3個迄表示する事ができ、ボタンに表示する文字を書いて行きます。

省略すると、キャンセルと、OKの二つのボタンを表示します。

例) display dialog "あなたの性別は?" buttons {"おかま","おんな","おとこ"}
buttonNumberOrName デフォルトのボタンを指定します。
ボタンが二重に囲まれているやつです。
デフォルトでは、OKボタンがデフォルトボタンになりますが、buttonlistの指定がある時には、ボタンの文字もしくは番号を指定したものがデフォルトボタンになり、省略した場合にはデフォルトボタンは無くなります。
例1)display dialog "あなたの性別は?" buttons {"おかま","おんな","おとこ"} default button "おかま"

例2)display dialog "あなたの性別は?" buttons {"おかま","おんな","おとこ"} default button 1

例3)display dialog "作業を続行しますか?" default button "キャンセル"
iconNumberOrName ダイアログ内にアイコンを表示させます。
ICONリソースの名前もしくは、リソース番号を指定するのですが、意味は別の所で調べてみて下さい。
例1)STOPアイコン display dialog "この操作は間違っています" with icon 0

例1)NOTEアイコンdisplay dialog "こんな使い方もできるんですね" with icon 1

例1)CAUTIONアイコンdisplay dialog "この書類は危険です!" with icon 2
waitingSeconds タイムアウト時間の設定。
ユーザーに入力を求めた場合、スクリプトはそこで待機状態になってしまいます。
しかし、AppleScriptは60秒間何もアクションが無いとタイムアウトエラーを出し、エラーになってしまいます。(回避策は別にあります。)
そこで、何秒か待った後、何も応答が無い場合には、スクリプトを続行するように、待機時間を設定します。
例) display dialog "このダイアログは5秒後に自動的に閉じます" giving up after 5

 

ではダイアログから返された文字や、押されたボタンの結果を得るにはどうしたら良いのでしょうか。

button returned
押されたボタンの文字列を返します。

例)set kotae to button returned of the result
(※kotaeは変数です。結果はkotaeの中に入ります。)

text returned
テキストフィールドに入力された文字列を返します。

例)set kotae to text returned of the result

gave up
ダイアログがタイムアウトで閉じた時にはtrueを返し、そうでない時はfalseを返します。
giving upが省略されている時には何も返しません。

例)set kotae to gave up of the result

つまり、

set bdStr to text returned of the result
set bdDate to date bdStr

というのは、変数bdStrにテキストフィールドに入力された生年月日を、テキストとして代入しているわけです。

そしてそれを、変数bdDateにテキストからdate形式(日付形式)に変換して代入しています。

set yourDays to ((current date) - bdDate) div days
set uranai to yourDays mod 4

さて、ここでは何をしているのかと言うと、生まれてからの日数を計算し、変数yourDaysに代入します。

また日数を元に占い結果を出すために、日数を4で割、除数を変数uranaiに代入しています。
なぜ4で割るのかと言うと、今回の占いの結果は4種類だけですので、4の除数は0、1、2、3の4種類だけになりますので、除数で結果を占っているだけです。
(つまり毎日占っていると、結果が順番に入れ替わって行くだけジャん)

またここで新しく出てきたコマンドを紹介しよう。

date 日付と時刻を表すクラスです。
current date 現在の日付と時刻をdateクラスで返します。
day(s) dateクラスの日にちを表す整数です。

 

ここでは細かな注釈は割愛させて頂きます。
日付関連の扱いは大変複雑怪奇です。また別の機会にでも解説して行きたいと思いますので、ここでは「そんなものもあるんだな」と言うくらいに覚えておいて下さい。

さぁ!これで最後ですガンバっていきまっしょい!

if uranai = 0 then

 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、赤子のようなお肌!" & return & "あなたの運勢は大吉とでました。" buttons "おめでとーう!"

else if uranai = 1 then

 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、まだまだお若い!" & return & "あなたの運勢は吉とでました。" buttons "やったね!"
else if uranai = 2 then

 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、少しお疲れのような!" & return & "あなたの運勢は凶とでました。" buttons "ざんねーん!"

else

 display dialog "あなたが生まれてから、" & yourDays & "日経っていますが、あと何日もつやら!" & return & "あなたの運勢は大凶とでました。" buttons "おそろしや!"

end if

このスクリプトの中にもdisplay dialogが出てきますが、結果を表示しているんですね!

結果は4種類あり、どれを表示するのかは変数uranaiで決まります。

条件分岐のコマンド

If 条件1 then(条件1が真ならば命令1を実行しなさい)
 命令1
[else if 条件2 then](条件1が偽で、条件2が真ならば命令2を実行しなさい)
 命令2
[else](条件1と、条件2が儀ならば命令3を実行しなさい)
 命令3
end if

[]内はオプションですので、省略する事ができますが、続く命令文も書く事はできません。

例1)

set A to 3 --変数Aに3を代入
if (A mod 2) = 0 then --Aを2で割った除数が0であるか判断している
 set B to "偶数" --条件が真であれば変数Bに文字列偶数を代入する
else --先の条件が偽であれば、次の命令文を実行し、変数Bに文字列奇数を代入する
 set B to "奇数"
end if

(結果は、変数Bに文字列奇数が入る)

説明はここまで。

判ってもらえましたか?
できたスクリプトはアプリケーションとして保存し、みんなに見せて上げましょう。

また、このままでは結果が順番に変わって行くだけなので、面白くありません。

乱数を使って毎回結果を変える事もできます。

set ransu to random number 10

上のスクリプトを実行すると、変数ransuに0から10の間の整数がランダムに代入されます。
これを利用して、毎回ちがう結果の出る占いスクリプトを作ることができます。

みなさん挑戦をしてみて、うまく行ったら掲示板にでもスクリプトを上げてみて下さい。

ページのTopに戻る