4

新しいテーブルを挿入したいシートが新しいか現在選択されていない限り、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の一部の高度なスプレッドシートスクリプトでは少し問題のように見えます。

4

1 に答える 1

0

わかった。私の最初の回答は受け入れられ、削除できませんでしたが、不十分だったので、編集して実際に問題を解決するコードを追加することにしました!

このコードは、Nigel Garvey の功績を認めている Yvan Koenig から提供されています。どちらもapplescript-users listで活発に活動していますが、これは素晴らしいことです。特に、この 2 人の紳士や他の多くの偉大な AppleScripter の活動のおかげです。

それは GUI スクリプトに依存しています (頼らなければならないのは常に恐ろしいことですが、それは私たちが持っているものです)。

を呼び出すとmy activateGUIscripting()、管理者パスワードを求めるプロンプトが表示される場合があります。GUI スクリプトが有効になっていることが確実にわかっている場合([システム設定] -> [ユニバーサル アクセス] -> [補助デバイスのアクセスを有効にする])、この行を省略できます。

次の 2 行は呼び出しの例にすぎないため、これらの呼び出しの例を機能させるには、「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
于 2011-05-30T15:50:12.380 に答える