Как сделать опрос с помощью AppleScript - PullRequest
2 голосов
/ 13 августа 2011

Традиционно каждый человек получает только один голос. Я бы хотел сделать то же самое с опросом.

У меня есть куча учетных записей на моем Mac OS X на работе. Мы голосуем за то, чтобы избрать кого-то в качестве нашего нового начальника отдела (нет, я не скажу, кто), чтобы узнать, имеет ли он право на работу. Я решил написать небольшой сценарий, который сделает эту работу за нас. Однако я не могу сделать одну вещь: убедиться, что пользователь может голосовать только один раз . Мой скрипт ниже (он явно не будет компилироваться):

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", и это сработало, но я все еще знаю, как проверить, голосовал ли пользователь.

Полагаю, заголовок вопроса должен звучать так: «Как проверить, голосовал ли пользователь?».

Большое спасибо,

Bill

1 Ответ

2 голосов
/ 13 августа 2011

На вашем месте я бы создал базу данных в приложении Database Events под названием "Избиратели". При запуске сценария проверьте наличие записи, имя которой соответствует имени текущего пользователя. Если запись существует, пользователь проголосовал. Аналогично, если запись не существует, пользователь не голосовал. Этот абзац в переводе на код гласит:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...