Обмін кількома файлами на iCloud за допомогою системних подій в Applescript: Як перехопити варіант?


2

Я намагаюся поділитись папкою з багатьма файлами Numbers з iCloud, поділившись кожним файлом з AppleScript і зберігаючи шлях кожного спільного файлу, щоб я міг надіслати його своїм співробітникам. Для цього я використовую системні події. Я дійшов до того, що я можу ділитися файлами, але я не можу зробити щось дійсно просте.

За замовчуванням, коли ви ділитесь файлом, Numbers надає вам опцію "Пошта" за замовчуванням у розділі "Запросити з ...". Також є опція "Скопіювати посилання". Якщо я знайду спосіб вибрати цей варіант, я можу змусити працювати все інше. Однак, незважаючи на багато моїх спроб, я не міг знайти способу сказати системним подіям змінити цей вибір. Але я бачу, який синтаксис використовує Automator для тієї самої дії, але коли я копіюю цей синтаксис у редактор сценаріїв, дія не виконується.

Якщо ви хочете зрозуміти, у чому проблема, якщо припустити, що у папці Numbers вашого диска iCloud у вас є файл "test.numbers", наступний сценарій поділиться цим файлом (вставте його в додаток редактора сценаріїв):

=====

    tell application "Finder"
        open POSIX file "/Users/[
   XXXPUT HERE YOUR USER NAME
   ]/Library/Mobile Documents/com~apple~Numbers/Documents/test.numbers"

        end tell
    delay 2
    tell application "System Events"
        tell process "Numbers"
            delay 1
            tell menu bar 1
                tell menu bar item "Share"
                    tell menu "Share"
                        delay 1
                        click menu item "Share Link via iCloud…"
                        delay 1
                    end tell
                end tell
            end tell
            click button "Share Spreadsheet" of UI element 1 of sheet 1 of window "test"
            delay 5
        end tell
        delay 5
        tell process "Numbers"
            tell menu bar 1
                tell menu bar item "Numbers"
                    tell menu "Numbers"
                        delay 1
                        click menu item "Quit Numbers"
                    end tell
                end tell
            end tell
        end tell
    end tell

=====

Однак я не знайшов способу зробити простий додатковий крок зміни значення за замовчуванням розсилки посилання (ви побачите, що сценарій вставляє посилання в повідомлення.

Хтось має підказку, як цього досягти? Я спробував наступні можливості, з виклику до "Системних подій": - натисніть на зображення 1 елемента інтерфейсу 3 рядка 1 області прокрутки 1 елемента інтерфейсу 1 аркуша 1 вікна "тест" процесу заявки "Числа" - -натисніть кнопку "Скопіювати посилання" рядка 1 області прокрутки 1 елемента інтерфейсу інтерфейсу 1 аркуша 1 вікна "тест" процесу застосування "Числа" - натисніть елемент інтерфейсу 3 рядка 1 області прокрутки 1 елемента інтерфейсу 1 аркуш 1 вікна "тест" процесу заявки "Номери"

Коли сценарій не скаржиться, дія просто не виконується. Для наочності я кажу про вибір параметра "Скопіювати посилання" на вставленому зображенні:

За замовчуванням Спадне вікно Share Share

Будь-яка пропозиція вітається. Дякую,

(Використання OSX El Capitain 10.11.5)

Відповіді:


1

Добре, тому я відповідаю на власне запитання. Можна робити те, що я хотів, хоча не знайшов задовільного рішення.

Коротка відповідь: Я не міг знайти спосіб використання яблучного сценарію при безпосередньому маніпулюванні графічним інтерфейсом (наприклад, клацання). Я знайшов спосіб, використовуючи ключові альтернативи. Щоб виконати точну роботу, яка мені потрібна, буде виконана наступна послідовність:

- після відкриття документа в Numbers відкрийте вікно спільного доступу:

tell application "System Events"
    tell process "Numbers"
        delay 1
        tell menu bar 1
            tell menu bar item "Share"
                tell menu "Share"

                    delay 1
                    click menu item "Share Link via iCloud…"

                end tell

            end tell
        end tell

    end tell

- коли відкриється спадне вікно спільного доступу, використовуйте наступну комбінацію клавіш

tell application "System Events"
--add tabs

    delay 1
    key code 48
    delay 1
    key code 48
    delay 1
    -- use arrows to move to the right part of the 'Share' window
    key code 124
    delay 1
    key code 124

    delay 3
    --  click return
    key code 36

    delay 8
    -- save the file and close it
    keystroke "s" using {command down}
    delay 4
    keystroke "w" using {command down}

Довга відповідь: це біль у шиї з ряду причин.

По-перше, коли ви створюєте файл Numbers, це простий файл. Однак, коли він ділиться спільно або коли він зберігається в iCloud, він стає пакетом. Applescript розглядає пакунки як папки, тому вам доведеться зробити деяку перевірку, перш ніж робити що-небудь, чи є те, з чим ви маєте справу - це папка чи пакет. Потім можна перейти до операцій спільного використання.

Тепер я не знайшов принципового способу перехоплення, коли саме файл стає пакетом. Тобто, коли ви відкриєте файл Numbers і попросите його поділитися, ви побачите, що Numbers надає вам повідомлення про "підготовку документа для спільного використання". Це я знайшов, коли файл перетворюється в пакет. Є властивість, яку можна використовувати, щоб перевірити, чи відповідає вказаний шлях пакету чи одному файлу: можна циклічити (папка пакета item_info є помилковим), а потім продовжити, але ця властивість стає також істинною до того, як "Номери" закінчили свою "підготовку документа до спільного використання". Тож я міг лише здогадуватися, коли зможу продовжити та перейти до спільної частини сценарію. Я кладу приблизно 30 секунд, коли файл ще не є пакетом,

if (this_package_folder is false) and (this_extension is in the extension_list) then
    delay 30
end if

По-друге, ви повинні бути в хорошій мережі, так що всі операції, пов'язані з Numbers в iCloud, можна буде виконувати безперебійно - інакше iCloud видасть вам повідомлення про помилки, які блокують виконання сценарію

По-третє, ви повинні подбати про .DS_Store файли та інші файли, які можуть знаходитися всередині папки, куди ви поміщаєте ваші Numbers документи для спільного використання.

По-четверте, якщо ви хочете визначити, де знаходиться папка iCloud з документами, якими слід ділитися, зсередини AppleScript ви не побачите її так, як бачите в пошуку (тобто в iCloud Drive), але вам доведеться шукати для цього в / yourUser / Library / Mobile Documents / iCloud Drive / у вашій папці.

З усіма цими застереженнями, ось сценарій, який я зараз використовую. У моїй системі вона працює. Він передбачає кілька речей:

  1. у вашому iCloud є папка, де є ваші документи на номери
  2. у вас є файл, де ви хочете зберегти шляхи до файлів, якими ви будете ділитися, щоб ви знали шляхи, якими ви маєте спілкуватися з тими, з ким ви хочете поділитися своїми файлами. У моєму випадку я використовую документ Pages.
  3. файли, якими слід ділитися, НЕ вже надані. В іншому випадку сценарій видасть помилки.
  4. вас не хвилюють помилки та стиль. У скрипті немає перевірок помилок. Я не програміст.

Сценарій попросить вас спочатку визначити папку з документами, якими слід ділитися, а потім файл Сторінки, де ви хочете зберегти шляхи до спільних документів, а потім відкриє документи, якими слід ділитися один за одним, поділиться ними, збереже їх, скопіює їх шлях до вибраного вами документа "Сторінки" і, нарешті, вийде з "Чисел і Сторінок". Дайте багато часу для виконання сценарію і не заважайте йому. Зверніть увагу, що відкриваючи кожен файл Numbers, ви можете змінити сценарій так, щоб ви вставляли конкретні операції, які ви хочете виконати у своїх файлах, завжди з однаковою технікою (наприклад, у моєму випадку мені потрібно знайти клітинку, знайти значення, скопіюйте його десь інше і збережіть. Ця частина процедури відсутня в сценарії нижче.

Тепер, якщо хтось знайде спосіб ПЕРЕВІРИТИСЯ операції, видалити спільний доступ до спільних файлів, і, особливо, спосіб сказати, чи файл НАДАЄ загальний доступ чи ні, так що сценарій набуває загальності ...

Я вставляю сценарій нижче.

-- Beginning of the script
global f

property extension_list : {"numbers"}
tell application "Finder"
set source_folder to choose folder with prompt "Please select directory."
set posixSource_Folder to POSIX path of source_folder
tell application "System Events"

    set these_items to POSIX path of disk items of folder posixSource_Folder
end tell

my createList(these_items)
end tell

on createList(these_items)
tell application "System Events"
    tell application "Finder"
        set f to (choose file with prompt "Choose a file where to store the paths")
    end tell
end tell
set posixF to POSIX path of f
delay 2
tell application "Finder" to open file f
delay 1
repeat with i from 1 to the count of these_items
    set this_item to item i of these_items

    set the item_info to info for this_item
    set this_extension to the name extension of item_info
    if folder of the item_info is true and (package folder of the item_info is false) and (this_extension is not in the extension_list) then

        process_folder(this_item)

    else
        if (this_extension is in the extension_list) then
            process_item(this_item)

        end if
    end if
end repeat
close_files()
end createList

-- this sub-routine processes folders 
on process_folder(this_folder)
-- set these_items to list folder this_folder without invisibles
set posix_this_folder to POSIX path of this_folder
tell application "System Events"

    set these_items to POSIX path of disk items of folder posix_this_folder
end tell
repeat with i from 1 to the count of these_items
    --set this_item to alias ((this_folder as Unicode text) & (item i of these_items))
    set the item_info to info for this_item
    set this_extension to the name extension of item_info
    --if folder of the item_info is true and (this_extension is not in the extension_list) then
    if folder of the item_info is true and (package folder of the item_info is false) and (this_extension is not in the extension_list) then

        process_folder(this_item)
    else
        if (package folder of the item_info is true) and (this_extension is in the extension_list) and (alias of the item_info is false) then
            process_item(this_item)

        end if


    end if
   end repeat
end process_folder

-- this sub-routine processes files 

on process_item(this_item)
set the item_info to info for this_item
set this_extension to the name extension of item_info
set this_package_folder to the package folder of item_info
set Posix_Item to POSIX path of this_item

set Posix_File to POSIX file Posix_Item
delay 1
--opening the Numbers file
tell application "Finder" to open Posix_File
delay 3
-- going to Numbers and making the file shared

tell application "System Events"
    tell process "Numbers"
        delay 1
        tell menu bar 1
            tell menu bar item "Share"
                tell menu "Share"

                    delay 1
                    click menu item "Share Link via iCloud…"

                end tell

            end tell
        end tell

    end tell

    -- extra time allowed for non packages

    delay 3
end tell
if (this_package_folder is false) and (this_extension is in the extension_list) then

    delay 30
end if


--tabs
tell application "System Events"
    delay 1
    key code 48
    delay 1
    key code 48
    delay 1
    -- arrows
    key code 124
    delay 1
    key code 124

    delay 3
    --  returns
    key code 36

    -- leave some time for Numbers to actually share the file. Maybe you need more time for your system.
    delay 8

    -- saving and closing documents
    keystroke "s" using {command down}
    delay 4
    keystroke "w" using {command down}

    -- Now returning to the file where the paths have to be pasted
    tell application "Finder" to open file f
    delay 2
    -- pasting the local Unix path
    keystroke "v" using {command down}
    delay 1
    key code 48

    delay 2
    -- pasting the iCloud remote path of the shared document
    set the clipboard to Posix_Item
    delay 1
    keystroke "v" using {command down}
    delay 1
    key code 48
    key code 36

    delay 1
    keystroke "s" using {command down}
end tell

end process_item


--closing files

on close_files()
tell application "System Events"
    tell process "Numbers"
        tell menu bar 1
            tell menu bar item "Numbers"
                tell menu "Numbers"

                    delay 1
                    click menu item "Quit Numbers"
                end tell
            end tell
        end tell
    end tell


    tell application "Finder" to open file f
    delay 2
    keystroke "q" using {command down}
    delay 1
end tell
end close_files
-- end of the script
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.