私があなたなら、Database Events
「Voters」というアプリケーションでデータベースを作成します。スクリプトの実行時に、名前が現在のユーザーの名前であるレコードを確認します。レコードが存在する場合、ユーザーは投票済みです。同様に、レコードが存在しない場合、ユーザーは投票していません。この段落をコードに変換すると、次のようになります。
set user_has_voted to false --inital value
tell application "Database Events"
try
get database "Voters"
open database POSIX path of (path to documents folder) & "/Databases/Voters.dbev"
on error
make new database with properties {name:"Voters"}
save
end try
end tell
set the current_user to the long user name of (system info)
tell application "Database Events"
tell database "Voters"
try
get record current_user
--No error, the user has voted
set user_has_voted to true
on error
make new record with properties {name:current_user}
set user_has_voted to false
end try
end tell
close database "Voters" saving yes
end tell
if user_has_voted then
...
else
vote()
end if
これは、同じユーザーが任意の時間枠内property
に投票したかどうかを判断できるため、 を使用するよりも安全です。
更新: @regulus6633 のコメントに従って、サブルーチン (前のスクリプトの一番下に置くことができます) と別のスクリプトを追加して、仕事を支援します。サブルーチンは投票をデータベースに保存し、サブルーチンに続くスクリプトはデータベースから情報を取得します。
on vote()
set the rating_results to (choose from list {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} with prompt "Please rate (somebody) based on your observations. BE HONEST!")
if the rating_results is false then error number -128
tell application "Database Events"
try
get database "Votes"
open database POSIX path of (path to documents folder) & "/Databases/Votes.dbev"
on error
make new database with properties {name:"Votes"}
save
end try
try
get record "Vote Frequency" of database "Votes"
on error
tell database "Votes" to make new record with properties {name:"Vote Frequency"}
end try
tell database "Votes"
tell record "Vote Frequency"
if exists field rating_results then
set the value of field rating_results to the value of field rating_results & the rating_results
else
tell (make new field with properties {name:rating_results, value:{}}) to set the end of the value of it to the rating_results
end if
end tell
end tell
close database "Votes" saving yes
end tell
end vote
データベースから投票情報を取得する方法を次に示しVotes
ます。
tell application "Database Events"
try
get database "Votes"
open database POSIX path of (path to documents folder) & "/Databases/Votes"
on error
my nobody_voted_yet() --Database Events doesn't allow any user interaction, so we have to use a subroutine to display information to the user
end try
set the votes to {}
set the vote_total to 0
tell database "Votes"
tell record "Vote Frequency"
repeat with i from 1 to the count of fields
repeat with this_vote in the value of field i
set the end of votes to this_vote
set the vote_total to the vote_total + this_vote
end repeat
end repeat
end tell
end tell
close database "Votes" saving yes --It is always a good idea to save the database, even if you're just retrieving values. This reduces the risk of the values changing themselves.
my average_votes(votes, vote_total)
end tell
on nobody_voted_yet()
display dialog "Nobody voted yet! You can't retrieve information that doesn't exist!" buttons{"Cancel"} default button 1
end nobody_voted_yet
on average_votes(vote_length, vote_total)
set the voting_result to (the vote_total / (length of the vote_length))
display dialog "The average rating for (somebody) is: " & (round the voting_result as string)
end average_votes