إنشاء جدول جديد بأرقام iWork على ورقة محددة باستخدام applescript

StackOverflow https://stackoverflow.com/questions/516805

  •  21-08-2019
  •  | 
  •  

سؤال

أواجه مشكلة في إنشاء جدول جديد على ورقة محددة باستخدام Applescript ما لم تكن الورقة التي أريد إدراج الجدول الجديد فيها إما جديدة أو محددة حاليًا.الشكل العام للكود الذي أستخدمه هو:

    tell application "Numbers"
    tell document 1
    tell sheet "This is the sheet I want to use"
    make new table with properties {name:"A new table"}
    end tell 
    end tell 
    end tell

هل حقق أي شخص المزيد من النجاح في تحقيق ذلك؟يبدو لي أن هذا يمثل مشكلة كبيرة بالنسبة لبعض البرامج النصية المتقدمة لجداول البيانات في Numbers.

هل كانت مفيدة؟

المحلول

نعم.تم قبول إجابتي الأولى ولا يمكن حذفها، ولكنها كانت غير كافية، لذلك قررت تعديلها وإضافة بعض التعليمات البرمجية التي تحل المشكلة حقًا!

يأتي هذا الرمز عبر Yvan Koenig، الذي ينسب الفضل إلى Nigel Garvey.كلاهما نشط على قائمة مستخدمي applescript, ، وهو أمر ممتاز بالمناسبة، لأسباب ليس أقلها نشاط هذين السيدين، والعديد من مصممي AppleScript العظماء الآخرين.

إنه يعتمد على البرمجة النصية لواجهة المستخدم الرسومية (وهو أمر فظيع دائمًا أن نلجأ إليه، ولكنه ما لدينا).

الدعوة الى my activateGUIscripting() قد يتسبب في ظهور مطالبة بكلمة مرور المسؤول.إذا كنت على الاطلاق يعرف أنه تم تمكين البرمجة النصية لواجهة المستخدم الرسومية (تفضيلات النظام->الوصول العالمي->تمكين الوصول للأجهزة المساعدة) - ثم يمكنك حذف هذا السطر.

السطران التاليان هما مجرد أمثلة على الاستدعاءات، لذلك تحتاج إلى ورقة تسمى "الورقة 1" لكي تعمل استدعاءات الأمثلة هذه.

سيسمح لك هذا بإنشاء جدول في أي ورقة في أي مستند، بغض النظر عما تم تحديده أو في المقدمة.

--EXAMPLE CALLS
my activateGUIscripting()
my selectsheet(1, "Sheet 1")
my createNewTable(1, "Sheet 1", "myNewTable", 69, 13)

--NUMBERS UTILS
on createNewTable(dName, sName, newTable, nb_rows, nb_columns)
    tell application "Numbers" to tell document dName to tell sheet sName
        make new table with properties {name:newTable, row count:nb_rows, column count:nb_columns}
    end tell
end createNewTable

--=====
on activateGUIscripting()
    (* to be sure than GUI scripting will be active *)
    tell application "System Events"
        if not (UI elements enabled) then set (UI elements enabled) to true
    end tell
end activateGUIscripting
--=====
(*
==== Uses GUIscripting ====
 *)
on selectsheet(theDoc, theSheet)
    script myScript
        property listeObjets : {}
        local maybe, targetSheetRow
        --+++++
        -- set log_report to "point 2 : " & (current date) & return
        --+++++
        tell application "Numbers"
            activate
            set theDoc to name of document theDoc (* useful if the passed value is a number *)
            tell document theDoc to set my listeObjets to name of sheets
        end tell -- "Numbers"…

        set maybe to theSheet is in my listeObjets
        set my listeObjets to {} -- So it will not be saved in the script *)
        if not maybe then
            error "The sheet “" & theSheet & "” is unavailable in the spreadsheet “" & theDoc & "” !"
        end if -- not maybe

        set maybe to 5 > (system attribute "sys2")
        tell application "System Events" to tell application process "Numbers"
            tell outline 1 of scroll area 1 of splitter group 1 of splitter group 1 of window theDoc
                if maybe then (* macOS X 10.4.x
'(value of attributes contains 0)': '(value of attribute "AXDisclosureLevel" is 0)' sometimes works in Tiger, sometimes not.
The only possible instances of 0 amongst the attributes are the disclosure level of a sheet row and the index of the first row, which represents a sheet anyway.
Another possibility is '(value of attribute -1 is 0)', which makes me uneasy. *)
                    set targetSheetRow to first row where ((value of attributes contains 0) and (value of first static text is theSheet))
                else (* macOS X 10.5.x or higher *)
                    set targetSheetRow to first row where ((value of attribute "AXDisclosureLevel" is 0) and ((groups is {}) and (value of first static text is theSheet)) or (value of first group's first static text is theSheet))
                end if -- maybe…
                (*
Handler modified to accomodate sheets requiring a lot of time to get the focus
*)
                tell targetSheetRow to set value of attribute "AXSelected" to true
                set cnt to 0
                repeat (*
Must way that Numbers becomes ready to receive the value *)
                    try
                        tell targetSheetRow to set value of attribute "AXDisclosing" to true
                        exit repeat
                    on error
                        set cnt to cnt + 1
                        delay 0.5 -- half a second
                    end try
                end repeat
            end tell -- outline…
        end tell -- "System Events"…
        --+++++
        -- set log_report to log_report & "point 3, cnt = " & cnt & return & (current date) & return
        --+++++
        tell application "Numbers" to tell document theDoc to tell sheet theSheet to tell table 1
            with timeout of 20 * 60 seconds (*
WITH this setting, the script will be able to wait 20 minutes for the asked value.
I hope that the document will not be so huge that this delay prove to be too short. *)
                value of cell "A1"
            end timeout
        end tell -- "Numbers"…
        --+++++
        -- set log_report to log_report & "point 4 : " & (current date) & return
        --+++++
        tell application "System Events" to tell application process "Numbers" (*
Do the trick one more time to be sure that the sheet is open *)
            tell targetSheetRow to set value of attribute "AXDisclosing" to true
        end tell -- "System Events"…
        --+++++
        -- return log_report & "point 5 : " & (current date) & return
        --+++++
        (*
End of the modified piece of code
*)
    end script
    run myScript
end selectsheet
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top