I am a beginner when it comes to AppleScript. I'm trying to develop a program that can generate an actually random number. When I set the values of the numbers that will be used to generate the random number, the editor gives me an error:
The variable numberOne is not defined.
I know what this means, but I don't know why it isn't defined. Can someone help with this?
I've tried seeing if only strings would work instead of text, but that doesn't seem to do it. There could be a really easy fix to this, but as I said, I'm a beginner.
on variableValue()
set numberOne to text returned of (display dialog "Variable One:" default answer "" with icon note buttons {"Cancel", "Continue"} default button 2 with title "Random Number Generator 3") as string
set numberTwo to text returned of (display dialog "Variable Two:" default answer "" with icon note buttons {"Cancel", "Continue"} default button 2 with title "Random Number Generator 3") as string
set numberThree to text returned of (display dialog "Variable Three:" default answer "" with icon note buttons {"Cancel", "Continue"} default button 2 with title "Random Number Generator 3") as string
set numberFour to text returned of (display dialog "Variable Four:" default answer "" with icon note buttons {"Cancel", "Continue"} default button 2 with title "Random Number Generator 3") as string
set numberFive to text returned of (display dialog "Variable Five:" default answer "" with icon note buttons {"Cancel", "Continue"} default button 2 with title "Random Number Generator 3") as string
set useSameValues to button returned of (display alert "Use same values?" message "If you re-generate a new number, do you want to use the same values?" as critical buttons {"Cancel", "No", "Yes"} default button 3)
if useSameValues = "No" then
set useSameValuesTwo to "false"
else if useSameValues = "Yes" then
set useSameValuesTwo to "true"
end if
end variableValue
variableValue()
on randomNumber()
-- The line of code just beneath this text is where the error shows up (This is my first program that utilizes handlers, so something could be wrong there).
set numberSix to (numberOne + numberTwo + numberThree + numberFour + numberFive)
set numberSeven to (numberSix * (random number from 1 to (random number from 2 to 100)))
set possibleValueOne to (random number from 1 to 5)
if possibleValueOne = 1 then
set numberEight to (numberSeven - numberOne)
else if possibleValueOne = 2 then
set numberEight to (numberSeven - numberTwo)
else if possibleValueOne = 3 then
set numberEight to (numberSeven - numberThree)
else if possibleValueOne = 4 then
set numberEight to (numberSeven - numberFour)
else if possibleValueOne = 5 then
set numberEight to (numberSeven - numberFive)
end if
set numberNine to (numberEight - 100000)
end randomNumber
randomNumber()
In AppleScript (like most languages), variables have a scope, which is where a declared identifier is recognized within any given script object. Variables declared inside a handler are local to that handler and don't exist outside of it, so you will need to provide some means to make them available elsewhere. There are a few ways to do this, such as declaring global variables or properties, or having a handler return values to the caller.
In your example, the variables declared in your variableValue() handler are not available outside the handler, so it would probably be the easiest to just declare those variables as global, for example by adding the following declaration at the beginning of your script:
global numberOne, numberTwo, numberThree, numberFour, numberFIve
Look at the following code:
set TheStringsQ1Happy to {"Fabulous", "Great", "Alright", "Excited", "Not Bad", "", "Decent", "Fine", "Awesome", "Bored", "Cool", "Sad", "Fantastic", "Alright", "Good", "Ok"}
set theResponse to the text returned of (display dialog "" default answer "" giving up after 5)
if TheStringsQ1Happy contains theResponse then
display dialog "That's Great!"
else
say "That term is not in my vocabulary. Would you like me to add it?" using "Tom" speaking rate 220
set theResponseNotInVocabulary to text returned of (display dialog "" default answer "" giving up after 5)
if theResponseNotInVocabulary is "Yes" then
set end of TheStringsQ1Happy to theResponse
return TheStringsQ1Happy
end if
Although I can update TheStringsQ1Happy, this update only lasts the span of the script. How can I change the code so that every time I run the script, it also contains the updated vocabulary?
For example, if I said "All Good", the computer would recognize that the vocabulary is not on the list, and would later update this list only for that instance. How can I make it so that "All Good" stays for every instance from now on?
The following is strictly an example to help you with what you asked, not fix the broken code you posted.
If you run the following in Script Editor:
property theList : {1, 2, 3}
copy (count theList) + 1 to end of theList
log theList
You'll see theList as a property grow by 1 each time you run it, that is until the script is recompiled.
If you need absolute long term storage where nothing will be lost of anything added to theList, then you need to save to and retrieve from a disk file.
Variables in AppleScript don't span outside the duration of execution of the script in which they are defined, as you've quite rightly noticed.
However, a property can, and will continue into subsequent executions of a script with the information left over from the previous execution.
Bear in mind, though, that a property will get reset (restored to its original value) each time the script is re-compiled (which happens whenever you make edits to it, or trigger it to compile manually).
With this in mind, change this line:
set TheStringsQ1Happy to {"Fabulous", "Great", "Alright", "Excited", "Not Bad", "", "Decent", "Fine", "Awesome", "Bored", "Cool", "Sad", "Fantastic", "Alright", "Good", "Ok"}
to this:
property TheStringsQ1Happy : {"Fabulous", "Great", "Alright", "Excited", "Not Bad", "", "Decent", "Fine", "Awesome", "Bored", "Cool", "Sad", "Fantastic", "Alright", "Good", "Ok"}
and you'll be good to go.
If you want a more permanent way to ensure you don't accidentally lose the new additions to this property, such as when you need to make any changes to the script in the future that will reset its value, then you'll need to store the information in an external file, which will serve as a sort of "dictionary" of vocabulary terms.
The simplest way to do this is to create a text file and put each item of the list on its own line, like this:
Fabulous
Great
Alright
Excited
...etc.
Save it as something like HappyTerms.txt, somewhere like your Documents folder, then change the variable declaration for TheStringsQ1Happy to this:
set TheStringsQ1Happy to the paragraphs of (read "/Users/%you%/Documents/HappyTerms.txt")
replacing %you% with the name of your Home folder in which your Documents folder lives. In fact, it's a useful idea to put the path to this text file in its own variable definition just beforehand:
set VocabDictionary to "/Users/%you%/Documents/HappyTerms.txt"
set TheStringsQ1Happy to the paragraphs of (read VocabDictionary)
Finally, to make changes to this file and add new terms to it, immediately after this line:
if theResponseNotInVocabulary is "Yes" then set end of TheStringsQ1Happy to theResponse
simply add either these lines:
set AppleScript's text item delimiters to return
write (TheStringsQ1Happy as text) to VocabDictionary starting at 1
OR this line
write "\n" & theResponse to VocabDictionary starting at (get eof VocabDictionary) + 1
The first version overwrites the entire file with all the terms in the new list. The second version simply appends the new addition to the end of the file. You might want to experiment with both and get the file turning out the way you want it to, as you'll sneakily discover that one might give you a stray blank line in the file that results harmlessly in an empty string "" appearing in your list; whilst the other does not; but I'll leave you to figure out if and why this happens, and—should you really want it not to happen—how to prevent it. 🙃 Either way, it shouldn't cause you any problems.
If you have any other queries, post a comment and I'll back to you. If this is helpful, don't forget to +1 my answer, and mark it as "correct" if solves your problem for you.
This works for me using the latest version of Sierra
If this script is saved as an application,and you launch this new app... every time a new Item is added to the list, that new item will remain in the list every time you reopen the application. However if you open the application again in script editor,to edit the code and re-save... You will lose all of the values of the added list items And the whole cycle starts over again with the default list.
property TheStringsQ1Happy : {"Fabulous", "Great", "Alright", "Excited", "Not Bad", "", "Decent", "Fine", "Awesome", "Bored", "Cool", "Sad", "Fantastic", "Alright", "Good", "Ok"}
set theResponse to (display dialog "How Do You Feel Today?" default answer "" giving up after 25)
if text returned of theResponse is in TheStringsQ1Happy then
display dialog "That's Great!"
else
say "That term is not in my vocabulary. Would you like me to add it?" using "Tom" speaking rate 220
set theResponseNotInVocabulary to display dialog "Add This Term" & " " & quote & text returned of theResponse & quote & " " & "To My Vocabulary?" buttons {"No", "Yes"} default button 2
if the button returned of the result is "Yes" then
if TheStringsQ1Happy does not contain text returned of theResponse then
set end of TheStringsQ1Happy to text returned of theResponse
end if
return TheStringsQ1Happy
end if
end if
I wish to keep only the first 13 caracters of a string in an applescript. I think I didn't understand how to use the "characters" function.
Can someone help me ?
choose from list {"0041325677667-pharmacie 1", "0041325677557-pharmacie 2",
"0041325677447-pharmacie 3", "0041325677337-pharmacie 4"} with prompt
"Thanks to select" without multiple selections allowed and empty selection allowed
return the result as string
return characters 1 thru 13 of result
Thanks in advance for your help
characters x thru y returns a list of characters, in your example item 1 returns
{"0", "0", "4" ,"1" ,"3" ,"2" ,"5" ,"6" ,"7" ,"7" ,"6" ,"6", "7"}
text x thru y returns a string as requested.
without multiple selections allowed and empty selection allowed is the default so it can be omitted. But you should consider the case when the user presses "Cancel", then the expression return boolean false.
set chosen to choose from list {"0041325677667-pharmacie 1", "0041325677557-pharmacie 2", "0041325677447-pharmacie 3", "0041325677337-pharmacie 4"} with prompt "Thanks to select"
if chosen is false then return "" -- in case of 'Cancel' return empty string
return text 1 thru 13 of (item 1 of chosen) -- as chosen returns a list by default it must be flattened
How to store the result of input in a variable ?
For exemplo:
display dialog "Insert Number" default answer "1" buttons{"Save"} default button 1
-- Result: {button returned:"OK", text returned:"1"}
How to capture the result and declare as the value of a variable?
set number to text returned as string
^ It doesn't work.
Help ? =P
set userResponse to text returned of (display dialog "Insert Number" default answer "1" buttons {"Save"} default button 1)
I have the following working example AppleScript snippet:
set str to "This is a string"
set outlist to {}
repeat with wrd in words of str
if wrd contains "is" then set end of outlist to wrd
end repeat
I know the whose clause in AppleScript can often be used to replace repeat loops such as this to significant performance gain. However in the case of text element lists such as words, characters and paragraphs I haven't been able to figure out a way to make this work.
I have tried:
set outlist to words of str whose text contains "is"
This fails with:
error "Can’t get {\"This\", \"is\", \"a\", \"string\"} whose text contains \"is\"." number -1728
, presumably because "text" is not a property of the text class. Looking at the AppleScript Reference for the text class, I see that "quoted form" is a property of the text class, so I half expected this to work:
set outlist to words of str whose quoted form contains "is"
But this also fails, with:
error "Can’t get {\"This\", \"is\", \"a\", \"string\"} whose quoted form contains \"is\"." number -1728
Is there any way to replace such a repeat loop with a whose clause in AppleScript?
From page 534 (working with text) of AppleScript 1-2-3
AppleScript does not consider paragraphs, words, and characters to be
scriptable objects that can be located by using the values of their
properties or elements in searches using a filter reference, or whose
clause.
Here is another approach:
set str to "This is a string"
set outlist to paragraphs of (do shell script "grep -o '\\w*is\\w*' <<< " & quoted form of str)
As #adayzdone has shown. It looks like you are out of luck with that.
But you could try using the offset command like this.
set wrd to "I am here"
set outlist to {}
set str to " This is a word"
if ((offset of space & "is" & space in str) as integer) is greater than 0 then set end of outlist to wrd
Note the spaces around "is" . This makes sure Offset is finding a whole word. Offset will find the first matching "is" in "This" otherwise.
UPDATE.
To use it as the OP wants
set wrd to "I am here"
set outlist to {}
set str to " This is a word"
repeat with wrd in words of str
if ((offset of "is" in wrd) as integer) is greater than 0 then set end of outlist to (wrd as string)
end repeat
-->{"This", "is"}