2

伝統的に、各人は 1 票しか得られません。投票投票でも同じことをしたいと思います。

仕事で Mac OS X にたくさんのアカウントを持っています。私たちは誰かを新しい部門長として選出する投票を行っています (いや、誰とは言いません) 彼がその仕事に適任かどうかを確かめるためです。私たちのために仕事をする小さなスクリプトを書くことにしました。ただし、私ができることは 1つだけです。ユーザーが 1 回だけ投票できるようにすることです。私のスクリプトは次のとおりです(明らかにコンパイルされません):

if the current user has never voted then --pseudo-code
    set the rating_results to (choose from list {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} with prompt "Please rate (anonymous) based on your observations. BE HONEST!")
    email_results(rating_results)
else
    display dialog "You already rated (anonymous)!"
end if

「これまでに何を試しましたか?」と尋ねることはわかっています。だから私はあなたに言います。試してみget the current userましたが、役に立ちませんでした。私も試してみましたがdo shell script "echo $USER"、うまくいきましたが、ユーザーが投票したかどうかを確認する方法はまだわかっています。

質問のタイトルは「ユーザーが投票したかどうかを確認するにはどうすればよいですか?」とすべきだと思います。

本当にありがとう、

明細書

4

1 に答える 1

2

私があなたなら、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
于 2011-08-13T01:28:03.490 に答える