Добавление электронной почты в новый контакт с JXA

Я пытаюсь создать контакт с помощью Javascript для автоматизации (JXA), но не могу понять, как добавить адрес электронной почты в контакт.

Это код для добавления контакта:

Contacts = Application('Contacts')
person = Contacts.Person().make()
person.firstName = "Tom"
person.lastName = "Tester"
Contacts.save()

Это работает, как ожидалось, т.е. е. он создает контакт с именем и фамилией.

Затем я попытался добавить этот код, чтобы добавить адрес электронной почты к контакту:

Contacts = Application('Contacts')
person = Contacts.Person().make()
person.firstName = "Tom"
person.lastName = "Tester"
email = Contacts.Email().make()
email.label = "Work"
email.value = "[email protected]"
Contacts.add({ email, to: person })
Contacts.save()

Строка email = Contacts.Email().make() выдает ошибку «Не удается создать или переместить этот элемент в этот контейнер».

Я также пробовал email = Contacts.ContactInfo().make(), та же ошибка. Затем я попробовал email = Contacts.Email(), который работает, включая назначение двух свойств label и value после этого, но затем строка Contacts.add({ email, to: person }) завершается с ошибкой «Не удается преобразовать типы».

Я в значительной степени озадачен тем, как это должно работать. Ни один из (очень немногих) примеров кода JXA, которые я смог найти, не помог в данном конкретном случае. Я предполагаю, что у меня есть какой-то фундаментальный аспект того, как этот API должен работать неправильно, но я просто не могу понять это, и небольшая доступная документация также не помогла. Кто-нибудь знает, как это должно работать?


person Tom Borowski    schedule 08.12.2018    source источник


Ответы (1)


Нашел ответ методом проб и ошибок, нет благодаря документации Apple:

Contacts = Application('Contacts')
person = Contacts.Person().make()
person.firstName = "Tom"
person.lastName = "Tester"
email = Contacts.Email({ label: "Work", value: "[email protected]" })
person.emails.push(email)
Contacts.save()

Итак, я думаю, что «хитрость» заключается в том, чтобы создать объект класса Email, не используя make(). Почему вы должны использовать make() при создании человека, а не при создании чего-либо еще, мне не понятно.

person Tom Borowski    schedule 08.12.2018
comment
JXA плохо разработан, искалечен и заброшен Apple. Вам гораздо лучше использовать AppleScript для задач автоматизации приложений — паршивый язык, но, по крайней мере, он правильно обрабатывает события Apple и имеет сообщество пользователей, которое поможет вам, когда вы застрянете. Довольно легко вызывать обработчики AppleScript из других языков через мост AppleScript-ObjC, так что вы можете по-прежнему смешивайте и сочетайте с $language по вашему выбору. - person foo; 09.12.2018