Apple Script: impossibile ottenere la data di "2018-12-12 10:00 AM"

2

Script Scopo Lo script seguente utilizza un'app chiamata Pashua per visualizzare una finestra di dialogo personalizzata che restituisce più input. Questi input vengono quindi utilizzati per creare un nuovo evento Calendar.

IlproblemaIlproblemariscontratoècheladatavienerestituitanelformatoAAAA-MM-GG.QuandoladatavieneinseritanelformatoMM/GG/AAAA,l'eventovienecreatosenzaproblemi.

Comepossoconvertirecorrettamenteladata?

Questesonolelineedicodicechehannobisognodiaiuto:

setsDateto(sDateoftheResult)---Returns:2018-12-12setsTimeto(sTimeoftheResult)---Returns:10:00AMseteDateto(eDateoftheResult)---Returns:2018-12-12seteTimeto(eTimeoftheResult)---Returns:11:00AMseteStarttodateof(sDate&space&sTime)---Error:Can’tgetdateof2018-12-1210:00AMseteEndtodateof(eDate&space&eTime)---Error:Can’tgetdateof2018-12-1211:00AM

Questoèl'errorecheappare:

Codiceintero:

--Getthepathtothefoldercontainingthisscripttellapplication"Finder"
set thisFolder to (container of (path to me)) as string
if "Pashua:Pashua.app:" exists then
    -- Looks like the Pashua disk image is mounted. Run from there.
    set customLocation to "⁨/Users/dnaab/Applications/"
else
    -- Search for Pashua in the standard locations
    set customLocation to "/Users/dnaab/Applications/"
end if
 end tell

 try
    set thePath to alias (thisFolder & "Pashua.scpt")
    set pashuaBinding to load script thePath

tell pashuaBinding
    -- Display the dialog

    try
        set pashuaLocation to getPashuaPath(customLocation)
        set dialogConfiguration to my getDialogConfiguration(pashuaLocation)
        set theResult to showDialog(dialogConfiguration, customLocation)

        -- Display the result. The record keys ("... of theResult") are defined in the
        -- dialog configuration string.
        if {} = theResult then
            display alert "Empty return value" message "It looks like Pashua had some problems using the window configuration." as warning
        else if cb of theResult is not "1" then

            set eCalendar to "Calendar"

            set eSummary to (eSummary of theResult)

            set eURL to (eURL of theResult)

            set eDescription to (eDescription of theResult)

            set sDate to (sDate of theResult)

            set sTime to (sTime of theResult)

            set eDate to (eDate of theResult)

            set eTime to (eTime of theResult)

            set sDate to date of (sDate & space & sTime)

            set eDate to date of (eDate & space & eTime)




            display dialog sDate buttons {"Cancel"} default button 1




            tell application "Calendar"
                tell calendar eCalendar
                    make new event with properties {summary:eSummary, start date:eStart, end date:eDate, url:eURL}
                end tell
            end tell
        else
            -- The cancelbutton (named "cb" in the config string) was pressed

            (*
            display dialog "The dialog was closed without submitting the values"
            *)

        end if
    on error errorMessage
        display alert "An error occurred" message errorMessage as warning
    end try
end tell

 on error errStr number errorNumber
display dialog errStr
 end try


 -- Returns the configuration string for an example dialog
 on getDialogConfiguration(pashuaLocation)

if pashuaLocation is not "" then
    set img to "img.type = image
          img.x = 250
          img.y = 260
          img.maxwidth = 60
          img.tooltip = This is an element of type “image”
          img.path = /Applications/Calendar.app/Contents/Resources/App.icns"
else
    set img to ""
end if

return "

 # Set window title
 *.title = New iCal Event

 # Event Summary
 eSummary.type = textfield
 eSummary.label = Event Summary
 eSummary.default = Calendar
 eSummary.width = 310
 eSummary.x = 1
 eSummary.y = 310

 # Add Start Date
 sDate.type = date
 sDate.label = Event Start Date
 sDate.default = today
 sDate.textual = 1
 sDate.x = 1
 sDate.y = 255

 # Add Start Time
 sTime.type = date
 sTime.label = Event Start Time
 sTime.default = today
 sTime.time = 1
 sTime.date = 0
 sTime.textual = 1
 sTime.width =70
 sTime.x = 110
 sTime.y = 255

 # Add End Date
 eDate.type = date
 eDate.label = Event Start Date
 eDate.default = today
 eDate.textual = 1
 eDate.x = 1
 eDate.y = 200

 # Add End Time
 eTime.type = textfield
 eTime.label = Event End Time
 eTime.width = 70
 eTime.x = 110
 eTime.y = 200

 # Add Calendar
 eURL.type = textfield
 eURL.label = URL
 eURL.default = message://
 eURL.width = 310
 eURL.x = 1
 eURL.y = 150

 # Description
 eDescription.type = textbox
 eDescription.label = Description
 eDescription.width = 310
 eDescription.x = 1
 eDescription.y =70

 # Add a cancel button with default label
 db.type = defaultbutton
 cb.type = cancelbutton
 "
 end getDialogConfiguration
    
posta David Naab 13.12.2018 - 03:13
fonte

1 risposta

0

Le date di AppleScript sono notoriamente pignoli sul formato. Prendono spunto dalla propria data di sistema & impostazioni temporali, quindi, anche se ho ottenuto uno script per funzionare correttamente sul mio sistema utilizzando una data specifica e amp; formato temporale, probabilmente non funzionerà sul tuo sistema a meno che tu non abbia le stesse impostazioni macOS.

Pertanto, il modo migliore per gestire gli oggetti data di AppleScript è crearli da zero utilizzando componenti di giorno, mese, anno e ora. In questo modo, funzionano in modo coerente su tutti i sistemi, ma, soprattutto, ti consentono di manipolarli nel tuo script senza errori imprevisti.

Aggiungi il seguente gestore alla fine del tuo script. Vi darà i mezzi per creare un oggetto data AppleScript fornendogli il giorno, il mese e l'anno e (opzionalmente) i componenti delle ore, dei minuti e dei secondi:

to makeASDate given year:y as integer ¬
    , month:m ¬
    , day:d as integer ¬
    , hours:h as integer : 0 ¬
    , minutes:min as integer : 0 ¬
    , seconds:s as integer : 0
    local y, m, d, h, min, s

    tell the (current date) to set ¬
        [ASDate, year, its month, day, time] to ¬
        [it, y, m, d, h * hours + min * minutes + s]

    ASDate
end makeASDate

Per usarlo, chiama semplicemente il gestore in questo modo:

makeASDate given year:2018, month:January, day:23
    --> date "Tuesday, 23 January 2018 at 00:00:00"

o

makeASDate given year:2018, month:1, day:23, hours:14, minutes:30, seconds:00
    --> date "Tuesday, 23 January 2018 at 14:30:00"

Ora, il tuo prossimo compito è quello di estrarre i componenti anno, mese al giorno dalle tue variabili per passarli al gestore makeASDate . Il modo più semplice per farlo è suddividere le variabili di data / ora in parole. Ad esempio, con la data e l'ora di inizio:

set [sy, sm, sd] to words of (sDate of theResult)
    --> {"2018", "12", "12"}

set [sh, smin, AMPM] to words of (sTime of theResult)
    --> {"10", "00", "AM"}
if AMPM = "PM" then set sh to sh + 12

e in modo simile ai tuoi tempi finali. Ho illustrato un test rapido con la variabile tempo per determinare se è AM o PM e ha modificato il valore della componente dell'ora di conseguenza (il gestore makeASDate utilizza il formato 24 ore). Dovrai eseguire un altro test con la tua variabile data per determinare in quale formato è inserita la data: dd/mm/yyyy o yyyy-mm-dd , che potrebbe essere facile come:

if (sDate of theResult) contains "-" then
    set [sy, sm, sd] to words of (sDate of theResult)
else if (sDate of theResult) contains "/" then
    set [sd, sm, sy] to words of (sDate of theResult)
end if
    
risposta data 15.12.2018 - 01:00
fonte

Leggi altre domande sui tag