2011-08-13 2 views
2

Traditionnellement, chaque personne obtient un seul vote. J'aimerais faire la même chose avec un sondage. J'ai un tas de comptes sur mon Mac OS X au travail. Nous votons pour élire quelqu'un comme nouveau chef de département (non je ne dirai pas qui) pour voir s'il se qualifie pour le travail. J'ai décidé d'écrire un petit script qui fait le travail pour nous. Cependant, je ne peux pas sembler faire une chose: assurez-vous qu'un utilisateur peut seulement voter une fois. Mon script est ci-dessous (il ne compilera pas évidemment): « Qu'ai-je essayé jusqu'à présent »Comment faire un sondage avec AppleScript

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 

Je sais que vous demanderez donc je vais te le dire. J'ai essayé get the current user, en vain. J'ai aussi essayé do shell script "echo $USER", ce qui a fonctionné, mais je sais encore comment vérifier si l'utilisateur a voté ou non.

Je suppose que le titre de la question devrait être "Comment puis-je vérifier si un utilisateur a voté ou non?".

Merci beaucoup,

Bill

+5

Saisissez tous les noms dans un document texte. Imprimez autant de copies qu'il y a d'électeurs et donnez une copie à chaque électeur. Demandez-leur de dessiner une coche à côté du nom de la personne qu'ils veulent élire, de plier le papier, puis de le mettre dans une boîte en carton. Quand tout le monde a voté, comptez les votes. La personne avec le plus de coches est élue. –

+0

Dour High, absolument génial. +1 pour les rires. – BRampersad

Répondre

2

Si je vous, je voudrais faire une base de données dans l'appelé « électeurs » demande Database Events. Lorsque le script est exécuté, recherchez un enregistrement dont le nom est le nom de l'utilisateur actuel. Si l'enregistrement existe, l'utilisateur a voté. De même, si l'enregistrement n'existe pas, l'utilisateur n'a pas voté. Traduit en code ce paragraphe se lit comme suit:

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 

Ceci est plus sûr que d'utiliser un property car il peut déterminer si le même utilisateur a voté dans ne importe quel délai. Par commentaire @ regulus6633, j'ai ajouté un sous-programme (que vous pouvez mettre en bas du script précédent) et un autre script pour vous aider dans votre travail. Le sous-programme stocke les votes dans une base de données, et le script suivant le sous-programme récupère les informations de la base de données.

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 

Voici comment vous récupérer les informations de vote de la base de données 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 
+1

J'aime cette idée d'une base de données. C'est facile et efficace. Je voudrais le prolonger cependant. Pourquoi ne pas enregistrer le vote dans la base de données aussi? Ensuite, vous ne devriez pas recevoir un email du vote. Vous pouvez utiliser un deuxième script pour récupérer les votes de la base de données. Le deuxième script les additionnerait pour vous et diviser par le nombre total d'enregistrements dans la base de données pour obtenir une note moyenne. – regulus6633

+0

@ regulus6633 J'ai mis à jour la réponse pour refléter ce que vous avez dit :) – fireshadow52

+0

Très belle fireshadow52, je l'aime! – regulus6633

Questions connexes