AppleScript cho các sự kiện iCal từ các mục trong Sổ địa chỉ


0

Tôi muốn tạo một tập lệnh tạo các sự kiện đáng báo động trong iCal cho ngày sinh nhật của những người mà tôi có trong sổ địa chỉ của mình. Thật không may, tôi rất tệ khi làm việc với AppleScript.

Dưới đây là phác thảo về những gì tôi phải làm, tôi rất muốn được giúp đỡ về kịch bản thực tế nên là gì.

  • chạy tập lệnh khi thay đổi được thực hiện đến ngày sinh trong sổ địa chỉ hoặc khi thoát khỏi sổ địa chỉ
  • xác định danh sách những người (sẽ có thêm một báo động, xem bên dưới)
  • tìm kiếm ngày sinh nhật nhập vào sổ địa chỉ
  • nếu không có sự kiện nào trong lịch ical có tên "sinh nhật" cho ngày sinh nhật được tìm thấy trong sổ địa chỉ (kiểm tra tên và ngày)
    • tạo sự kiện mới cả ngày trong lịch sinh nhật với báo thức về ngày và tiêu đề "(Tên của người))
  • nếu sinh nhật nằm trong danh sách được xác định sớm hơn
    • thêm báo thức hai tuần trước ngày sinh nhật
  • hiển thị thông báo hiển thị những sự kiện mới đã được tạo khi tập lệnh chạy

Tôi không nghĩ kịch bản sẽ phức tạp hay dài dòng. Bất kỳ trợ giúp sẽ được rất nhiều đánh giá cao.

Tôi không chắc làm thế nào kịch bản này có thể được kích hoạt, nhưng lý tưởng là nó sẽ chạy nếu một thay đổi được thực hiện cho một sinh nhật trong sổ địa chỉ (hoặc một cái mới được thêm vào).


Điều này không có nghĩa là một câu trả lời, rõ ràng, nhưng trong trường hợp nào thì sinh nhật trong Sổ địa chỉ không hiển thị trong lịch sinh nhật trong iCal? Tôi chưa bao giờ thấy hành vi (thiếu) đó ...
Dan J

Học Applescript rất hữu ích. Nhưng cá nhân tôi sử dụng iCal ngày 2 cho việc này.
Alan Shutko

Câu trả lời:


1

Để đặt cảnh báo duy nhất vào tất cả các ngày sinh nhật, bạn có thể tránh hoàn toàn một tập lệnh:

  1. Mở Tùy chọn Lịch trong Lịch.
  2. Trong mục Chung, đánh dấu vào "Hiển thị lịch sinh nhật".
  3. Trong Cảnh báo, đặt thông báo cho "Sinh nhật".

Tôi đã không dành thời gian để thực sự viết một AppleScript cho các phần báo động kép, nhưng bài viết này dường như đề cập đến các báo thức lịch kịch bản khá độc đáo. Tôi sẽ tưởng tượng bạn chỉ cần tạo một tệp hoặc danh sách trong tập lệnh chứa tên của các sự kiện (mà bạn có thể suy ra từ quy ước đặt tên tiêu chuẩn mà ứng dụng Lịch sử dụng).

Ngoài ra tôi đang sử dụng Mountain Lion với ứng dụng Lịch. Tôi không thể nhớ lại nếu các bước trên hoạt động trên các phiên bản cũ hơn của iCal.


Thời gian tối đa trước Cảnh báo cho sinh nhật iCal là 1 tuần (10.10.x) Nhưng bạn có thể cập nhật ngày cảnh báo từ trong các sự kiện riêng lẻ bằng cách sử dụng "tùy chỉnh"
markhunte

0

Tôi tin rằng sự khác biệt là lịch sinh nhật trên ical không tạo ra báo động trước sự kiện. Nó cũng không cho phép bạn thêm chúng bằng tay.

Tôi nghĩ rằng bạn có thể làm cho công việc này mặc dù với một kịch bản hành động thư mục. Kích hoạt lịch sinh nhật trong ical. Sau đó đính kèm một tập lệnh vào thư mục nơi các sự kiện này được lưu trữ. Khi một sự kiện mới được thêm vào (tức là bạn đã thêm một sinh nhật mới vào sổ địa chỉ của mình), tập lệnh sẽ được kích hoạt.

Đây là thư mục nơi tôi tìm thấy các sự kiện Sinh nhật của mình:

/ L Library / Calendars /FA907C55-E8CD-4291-8173-B3F86886E2BF.calWiki / Events

Bạn có thể phải tìm hiểu danh sách các lịch cho đến khi bạn tìm đúng thư mục, nhưng nó sẽ ở trong đó.

Từ đó, tập lệnh sẽ lấy mục mới được thêm vào thư mục, sau đó sao chép nó vào một lịch riêng và thêm báo thức. Để thiết lập nó, tôi sẽ tạo một lịch mới nơi bạn muốn loại bỏ các sự kiện mới này. Lấy các sự kiện từ lịch sinh nhật của bạn và kéo chúng lên màn hình nền hoặc một nơi nào đó (chúng sẽ bị xóa sau). Sau đó mở từng cái. Nó sẽ hỏi bạn muốn thêm lịch nào vào đó, vì vậy hãy chọn lịch mới mà bạn đã thực hiện. Xóa các tập tin, bạn đi, bây giờ bạn có thể thêm báo động cho chúng.

Tùy thuộc vào số ngày sinh của bạn, bạn có thể viết một tập lệnh sẽ thêm một sự kiện vào từng sự kiện này hoặc (nếu bạn giống tôi và có rất ít ngày được lưu) hãy thực hiện thủ công. Khi đã xong, một tập lệnh hành động thư mục sẽ thực hiện thủ thuật mà bạn đang tìm kiếm.

on adding folder items to this_folder after receiving these_items
    repeat with i from 1 to number of items in these_items
        set this_item to item i of these_items
        tell application "finder"
            move this_item to --location specifier of folder for new bday calendar
        end tell
    end repeat
    tell application "ical"
        reload calendars
        --add script here to add new alarms
    end tell
end on adding folder items to

Xin lỗi, tôi không có mã chính xác để bạn thêm báo thức. Hãy thử điều này mặc dù và cho tôi biết làm thế nào nó hoạt động!


0

Sổ địa chỉ đã phối hợp với iCal để tạo các sự kiện dựa trên ngày trong bất kỳ trường sinh nhật nào của người liên hệ. Nếu tất cả bạn chỉ cần báo động, thì bạn chỉ cần một cách để thêm báo động cho các sự kiện này.

Điều hấp dẫn là giao diện người dùng của iCal trình bày lịch như thể nó chỉ đọc. Nhưng với AppleScript, lịch không thực sự chỉ đọc. Bạn có thể sử dụng AppleScript để thêm báo thức vào các sự kiện trong lịch Sinh nhật của Sinh nhật:

on run
    (* Warning:
        This program will delete all the "display alarms" from the events in the
        synthetic "Birthdays" calendar. Usually, there are no alarms on these
        events because iCal treats this calendar as if it were read-only.

        The calendar is not, however, actually read-only when accessed through
        AppleScript. This program deletes all existing "display alarms" for all
        birthdays and sets a new one for 13.5 days before the the event
        (i.e. noon 14 days before, since the event occurs at midnight).
    *)
    tell application "iCal"
        set bcName to "Birthdays"
        set bc to a reference to calendar bcName
        if not (exists bc) then
            display alert "No “" & bcName & "” calendar!"
            return
        end if
        repeat with e in events of contents of bc
            -- make the following conditional if you only want alarms for some birthdays
            tell e
                delete display alarms
                make new display alarm with properties {trigger interval:-13.5 * 24 * 60}
            end tell
        end repeat
    end tell
end run

Mỗi khi bạn chạy chương trình này, nó sẽ, một cách hiệu quả, đảm bảo mỗi sinh nhật đều có báo động về nó. Dường như Address Book làm thay đổi chỉ tối thiểu khi nó cập nhật một sự kiện sinh nhật cho một tên đã thay đổi hoặc ngày sinh nhật; các báo động vẫn tồn tại trên các bản cập nhật từ Sổ địa chỉ , nhưng điều này có thể không đáng tin cậy vì Sổ địa chỉ sở hữu các sự kiện này và hoàn toàn có thể xóa và tạo lại chúng bất cứ khi nào nó cảm thấy cần phải làm như vậy.


Tôi không biết một cách chính thức để được thông báo về các thay đổi trong Sổ địa chỉ , nhưng như người trả lời khác gợi ý, bạn có thể nối một Thư mục hành động vào thư mục chứa các sự kiện cho lịch Sinh nhật của nhật ký. Bạn có thể mở thư mục đó với chương trình này:

tell application "iCal" to set bcuid to uid of calendar "Birthdays"
path to library folder from user domain
tell application "Finder" to open folder "Events" of folder (bcuid & ".calendar") of folder "Calendars" of result

Vì đây là một chi tiết nội bộ, nó có thể không đáng tin cậy trên các phiên bản HĐH khác nhau. Tất cả những điều trên đã được phát triển và thử nghiệm trên Mac OS X 10.6.8.

Ngoài ra, vì chương trình trên đảm bảo mỗi sinh nhật đều có báo thức, bạn chỉ cần sắp xếp để chạy nó một lần một ngày hoặc một lần khi đăng nhập (bạn có thể sử dụng một sự kiện iCal với báo thức của Run Run Script, hoặc lưu chương trình dưới dạng một ứng dụng và đặt nó làm mục đăng nhập).


Việc tạo các sự kiện của riêng bạn (trong lịch của riêng bạn) chắc chắn là có thể, nhưng việc giữ chúng được đồng bộ hóa với dữ liệu sinh nhật có thể khó khăn (việc tra cứu bằng tên và ngày tên thường là không đủ vì người dùng có thể thay đổi một trong hai điều đó và báo động Chương trình có thể không thể xác định các giá trị ban đầu vào thời điểm nó biết một liên hệ cụ thể đã được cập nhật với một tên mới hoặc ngày sinh nhật). Sổ địa chỉ giải quyết vấn đề này bằng cách mã hóa số nhận dạng duy nhất, nội bộ của liên hệ vào URL mà nó lưu vào urltài sản của mỗi sự kiện sinh nhật ; vì lịch chỉ có thể đọc được, nên nó không phải lo lắng về việc người dùng thay đổi hoặc xóa các URL đặc biệt của nó, vì vậy nó có thể dựa vào chúng là chính xác.

Chúng tôi xóa tất cả báo thức hiện có trên giả định rằng tất cả các cảnh báo là “chúng ta” vì Address Book không thêm báo động trên riêng của mình, và iCal không cho phép người dùng thêm báo động. Thật không may, không có tài sản bổ sung nào mà chúng tôi có thể thêm bất kỳ loại định danh duy nhất nào vào báo thức (mặc dù nếu thời gian chính xác của báo thức không quan trọng, có thể mã hóa một số thông tin trong giá trị số của phần bù phút của báo động ). Có vẻ dễ dàng hơn khi chỉ xóa các báo thức và tạo chính xác cái chúng ta muốn thay vì kiểm tra bất kỳ báo thức hiện có nào để xem chúng có khớp với cài đặt báo thức mong muốn hiện tại của chúng tôi không.


Hmm, có thể sửa đổi tập lệnh của bạn để nó không thêm cảnh báo cho những người có tài sản nhất định (ví dụ: Công ty hoặc mối quan hệ = đối tác cũ) hoặc những người trong một nhóm nhất định?
db
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.