Apple Script : "2018-12-12 10:00 AM"의 날짜를 가져올 수 없습니다.


2

스크립트 목적 아래 스크립트는 Pashua라는 App을 사용하여 여러 입력을 반환하는 사용자 정의 대화 상자를 표시합니다. 이러한 입력은 새 달력 이벤트를 만드는 데 사용됩니다.

enter image description here

문제 내가 겪고있는 문제는 날짜가 YYYY-MM-DD 형식으로 반환된다는 것입니다. 날짜를 MM / DD / YYYY 형식으로 입력하면 아무런 문제없이 이벤트가 작성됩니다.

날짜를 올바르게 변환하려면 어떻게합니까?

다음은 도움이 필요한 코드 행입니다.

            set sDate to (sDate of theResult)
            --- Returns: 2018-12-12

            set sTime to (sTime of theResult)
            --- Returns: 10:00 AM

            set eDate to (eDate of theResult)
            --- Returns: 2018-12-12

            set eTime to (eTime of theResult)
            --- Returns: 11:00 AM

            set eStart to date of (sDate & space & sTime)
            --- Error: Can’t get date of 2018-12-12 10:00 AM

            set eEnd to date of (eDate & space & eTime)
            --- Error: Can’t get date of 2018-12-12 11:00 AM

나타나는 오류입니다.

enter image description here

전체 코드 :

 -- Get the path to the folder containing this script
 tell application "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

암호 에서 날짜를 반환합니다. YYYY-MM-DD 체재? 우리가 스스로 테스트 할 수 있도록 관련 코드를 포함하십시오.
user3439894

코드를 추가했습니다.
David Naab

와우, 멋진 작품, 그리고 지금 방금 출판했습니다.
Buscar웃

답변:


0

AppleScript 날짜 형식으로 악명 높습니다. 그들은 당신의 시스템 날짜 & amp; 시간 설정 때문에 특정 날짜 & amp;를 사용하는 시스템에서 스크립트가 제대로 작동하더라도 시간 포맷을 사용한다면, 같은 macOS 설정을 가지고 있지 않으면 시스템에서 작동하지 않을 것입니다.

따라서 AppleScript 날짜 개체를 처리하는 가장 좋은 방법은 날짜, 월, 연도 및 시간 구성 요소를 사용하여 처음부터 개체를 만드는 것입니다. 그렇게하면 모든 시스템에서 일관되게 작동하지만 가장 중요한 것은 예기치 않은 오류없이 스크립트에서 스크립트를 조작 할 수 있습니다.

스크립트의 맨 아래에 다음 핸들러를 추가하십시오. 그것은 당신에게 일, 월, 일, 그리고 (옵션) 시간, 분, 초 구성 요소를 제공함으로써 AppleScript 날짜 객체를 생성 할 수있는 방법을 제공합니다 :

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

그것을 사용하려면 간단하게 핸들러를 다음과 같이 호출하십시오.

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

또는

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

이제, 다음 작업은 년, 월, 일 구성 요소를 변수에서 추출하여 변수를 변수에 전달하는 것입니다. makeASDate 매니저. 가장 쉬운 방법은 날짜 / 시간 변수를 단어로 분리하는 것입니다. 예를 들어, 시작 날짜와 시간 :

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

그리고 마찬가지로 당신의 마지막 시간. AM 또는 PM인지 여부를 결정하기 위해 시간 변수를 사용하여 빠른 테스트를하고 시간 구성 요소의 값을 적절하게 변경했습니다 ( makeASDate 처리기는 24 시간제를 사용합니다). 날짜 형식을 결정하려면 날짜 변수를 사용하여 다른 테스트를 수행해야합니다. dd/mm/yyyy 또는 yyyy-mm-dd이는 다음과 같이 쉽게 될 수 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.