代码之家  ›  专栏  ›  技术社区  ›  Ian Turner

使用applescript在特定图纸上的iWork编号中创建新表

  •  4
  • Ian Turner  · 技术社区  · 17 年前

    我使用的代码的一般形式是:

        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
    

    有人在实现这一点上取得了更多的成功吗?在我看来,这对于一些高级电子表格脚本来说是个问题。

    2 回复  |  直到 17 年前
        1
  •  0
  •   brennanyoung    15 年前

    applescript-users list ,这是非常好的,顺便说一句,不仅仅是因为这两位先生和其他许多伟大的应用程序描述者的活跃。

    my activateGUIscripting() 可能导致出现管理员密码提示。如果你绝对 知道

    接下来的两行只是示例调用,因此您需要一个名为“sheet 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
    
    推荐文章