Dan
Dan

Reputation: 13

Applescript if else statement inside of an if else statement with several repeats

HI I am having trouble getting this code to work properly. Here is the code:

property firstRow : 2051
property lastRow : 5584

set r to firstRow

-- highly recommended
-- close all of Safari's windows before...
tell application "Safari"
close windows
end tell


-- loop through the given row numbers
repeat until r is (lastRow + 1)

-- get the search value for Safari auto completion (column J)
try
    tell application "Microsoft Excel"
        tell active sheet
            set searchTerm to string value of range ("J" & r) of active sheet
        end tell
    end tell
on error
    -- no document open, exit the script
    return
end try

-- open Safari and make a new window
tell application "Safari"
    activate
    make new document with properties {URL:""}
    delay 0.5
    set pageLoaded to false
end tell

-- type the search value into the address field and hit return (aka select and open the first proposal)
tell application "System Events"
    -- here with Safari 6.1 text field 1 of group 2 of tool bar 1 of window 1 points to the URL field
    set focused of text field 1 of group 2 of toolbar 1 of window 1 of process "Safari" to true
    delay 0.5
    keystroke searchTerm
    delay 1.5
    keystroke return
end tell

-- let open Safari the suggested web page and read out the finally used URL
tell application "Safari"
    repeat while not pageLoaded -- keep doing this loop until loading complete
        delay 5
        if (do JavaScript "document.readyState" in document 1) is "complete" then
            set pageLoaded to true
        else
            -- not sure if this second else is needed, why not just wait until the first access has finished...

            -- close document 1
            -- make new document with properties {URL:""}
            -- tell application "System Events"
            --  delay 1.5
            --  set focused of text field 1 of group 2 of tool bar 1 of window 1 of process "Safari" to true
            --  delay 1.5
            --  keystroke searchTerm
            --  delay 1.5
            --  keystroke return
            -- end tell
        end if
        set thisULR to "NO SITE"
    end repeat
    try
        set thisURL to URL of document 1
    on error
        set thisURL to "NO SITE"
    end try
    close document 1
end tell

-- write the result into the cell next to the key word (column K)
tell application "Microsoft Excel"
    if thisURL ≠ "NO SITE" then
        tell active sheet
            make new hyperlink of cell ("K" & r) with properties {address:thisURL, name:thisURL}
        end tell
    else
        tell active sheet
            make new cell ("K" & r) with properties {name:"NO SITE"}
        end tell
    end if

end tell

set r to r + 1
end repeat

I am having trouble getting the code to not crash if there is no URL saved as variable thisURL.

However, it is still crashing. It often says thisURL is not defined and then it stops the script from going to the next r value instead of adding "NO SITE" to the cell. Not sure why its not working.

Upvotes: 0

Views: 541

Answers (2)

ShooTerKo
ShooTerKo

Reputation: 2282

Here is another solution. I tested with different delay values inside the System Events part and found a better way of getting the URL from Safari. Have a look at the two main parts of the script, everything else don't need changes:

-- type the search value into the address field and hit return (aka select and open the first proposal)
tell application "System Events"
    tell process "Safari"
        -- give time to prepare the window
        delay 0.5
        set focused of text field 1 of group 2 of toolbar 1 of window 1 to true
        -- give time to prepare the address field
        delay 0.5
        keystroke searchTerm
        -- give time to get the proposals
        delay 0.5
        keystroke return
    end tell
end tell

-- let Safari open the suggested web page and read out the finally used URL
tell application "Safari"
    -- setting the default value
    set thisURL to "NO SITE"
    try
        -- 6 tries with 5 seconds pause (-> max. 30 sec.)
        repeat 6 times
            try
                -- give time to load
                delay 5
                -- try to access the URL, if it is not available, an error occurs and the repeat loop starts again
                set thisURL to URL of document 1
                -- close the document
                close document 1
                -- no error till now, exit the repeat loop
                exit repeat
            end try
        end repeat
    on error
        -- just to be sure: close all windows
        try
            close windows
        end try
    end try
end tell

Greetings, Michael / Hamburg

Upvotes: 0

ShooTerKo
ShooTerKo

Reputation: 2282

It was a big chaos with all your end telland end ifetc. Another thing is that I don't understand why you need the second nested repeat-loop...

But I think I figured it out: You want to

  1. read a value from an excel sheet
  2. pretend to type the read out value into Safari's address bar
  3. use the autofill and read out the URL of the found site
  4. write the result into the adjacent excel cell

After your post edit I edited the code to this:

property firstRow : 62
property lastRow : 5584

set r to firstRow

-- highly recommended
-- close all of Safari's windows before...
tell application "Safari"
    close windows
end tell

-- loop through the given row numbers
repeat until r is (lastRow + 1)

    -- get the search value for Safari auto completion (column J)
    try
        tell application "Microsoft Excel"
            tell active sheet
                set searchTerm to string value of range ("J" & r) of active sheet
            end tell
        end tell
    on error
        -- no document open, exit the script
        return
    end try

    -- open Safari and make a new window
    tell application "Safari"
        activate
        make new document with properties {URL:""}
        set pageLoaded to false
    end tell

    -- type the search value into the address field and hit return (aka select and open the first proposal)
    tell application "System Events"
        -- here with Safari 6.1 text field 1 of group 2 of tool bar 1 of window 1 points to the URL field
        set focused of text field 1 of group 2 of tool bar 1 of window 1 of process "Safari" to true
        keystroke searchTerm
        delay 1.5
        keystroke return
    end tell

    -- let open Safari the suggested web page and read out the finally used URL
    tell application "Safari"
        try
            repeat while not pageLoaded -- keep doing this loop until loading complete
                delay 10
                if (do JavaScript "document.readyState" in document 1) is "complete" then
                    set pageLoaded to true
                end if
            end repeat
            set thisURL to URL of document 1
            close document 1
        on error
            set thisURL to "NO SITE"
            try
                close windows
            end try
        end try
    end tell

    -- write the result into the cell next to the key word (column K)
    tell application "Microsoft Excel"
        if thisURL ≠ "NO SITE" then
            tell active sheet
                make new hyperlink of cell ("K" & r) with properties {address:thisURL, name:thisURL}
            end tell
        else
             tell active sheet
                 make new cell ("K" & r) with properties {name:"NO SITE"}
             end tell
        end if
    end tell
    set r to r + 1
end repeat

Greetings, Michael / Hamburg

Upvotes: 1

Related Questions