Установка переменной в AppleScript на основе списка на листе Numbers

AppleScript начинающий здесь. Поиск высоко и низко еще не привел меня к ответу.

Я использую AppleScript, чтобы помочь в проведении молодежных турниров по борьбе. Каждое деление (по возрасту) разбивается на весовые категории. Например: Новичок 80 или Кадет 105.

Как только определенная группа детей попадает в определенную категорию / весовую категорию, эти дети добавляются на новый лист, содержащий их скобки (например, скобка March Madness, но небольшое число детей борется вместо того, чтобы играть в баскетбол).

Я выяснил, как поместить группу в новый лист, где они заполняют скобки, но когда этот новый лист создается, я не знаю, как заставить AppleScript изменить имя листа на правильный класс деления / веса, Я уверен, что это как-то связано с созданием переменных на основе списка классов делений / весов (которые у меня есть), но я не могу понять, как это сделать. Вот соответствующая часть кода:

tell document 1
        set active sheet to the last sheet
        set thisSheet to make new sheet
        set the name of thisSheet to "[Division variable – Weight class variable]"
        tell thisSheet
            delete every table
        end tell

Любые идеи о том, как заставить AppleScript назвать лист, как я хочу?

4 ответа

Решение

Чтобы дать вам небольшой пример того, что вы можете визуализировать то, что вы собираетесь, вот небольшой фрагмент. Я думаю, что это само за себя, перебрать список заголовков, а затем применить имена к листам.

set divisionNames to {"Novice", "Cadet"} -- How You Grab These Values Matters
set weightClasses to {"80", "105"} -- These Values Too

tell application "Numbers"
    activate
set thisDocument to make new document
tell thisDocument
    repeat with i from 1 to count of divisionNames
        make new sheet with properties {name:item i of divisionNames & space & item i of weightClasses}
    end repeat
end tell
end tell

С другой стороны, если вы извлекаете значения из списка в целом, то вы можете

set sheetTitles to {"Novice 80", "Cadet 105"}

tell application "Numbers"
activate
set thisDocument to make new document
tell thisDocument
    repeat with division in sheetTitles
        make new sheet with properties {name:division}
    end repeat
end tell
end tell

РЕДАКТИРОВАТЬ: В духе помощи школе или организации с низким или нулевым бюджетом... вот еще один пример ответа на второй вопрос, опубликованный в комментариях. Опять же, не зная структуры ваших данных, трудно дать вам точный ответ на ваш конкретный случай. Кроме того, вот ссылка на сайт, который может помочь продвижению вашего проекта. https://iworkautomation.com/numbers/index.html

(*
set sampleKids to {"John Doe", "Jane Doe", "Johnny Foe", "Janie Foe", "Tommy Joe", "Tammy Joe"}
set sampleDivisions to {"Novice-80", "Novice-85", "Cadet-105", "Cadet-110", "Novice-80", "Cadet-105"}

tell application "Numbers"
activate
set thisDoc to make new document with properties {name:"Wrestling Sample"}
tell thisDoc
    set the name of sheet 1 to "Sign In Sheet"
    tell active sheet
        delete every table
        set newTable to make new table with properties {row count:(count of sampleKids) + 1, column count:2, name:"Sign In Sheet"}
        tell newTable
            set value of cell 1 of column "A" to "Name"
            set value of cell 1 of column "B" to "Division"
            set x to 2
            repeat with eachName in sampleKids
                set value of cell x of column "A" to eachName
                set x to (x + 1)
            end repeat
            set x to 2
            repeat with eachDivision in sampleDivisions
                set value of cell x of column "B" to eachDivision
                set x to (x + 1)
            end repeat
        end tell
    end tell
end tell
end tell
*)

--********** IGNORE ABOVE THIS LINE IT'S ONLY BUILDING A SAMPLE TABLE **********--
--********** SAVE ABOVE TO ANOTHER SCRIPT FOR TESTING WITH NEW TABLE **********--

(*
ERROR HANDLING ISN'T PRESENT - AN EMPTY CELL IN FIRST COLUMN OR CHOSEN COLUMN WILL THROW AN 
ERROR SINCE THEY ARE THE IMPORTANT PIECES OF DATA FOR GRABBING LISTS - SAVE SCRIPT
TO NUMBERS SCRIPT FOLDER OF YOUR CHOICE - ENTER ALL INFO ON FIRST TABLE OF FIRST SHEET OF 
DOCUMENT THEN RUN SCRIPT - SCRIPT ACCEPTS ANY AMOUNT OF ROWS OR COLUMNS
*)

tell application "Numbers"
activate
-- Display A Simple Reminder That You're About To Lose Some Existing Data
display dialog "This Script Will Delete All Sheets Except The First Sheet Of This Document Before It Proceeds To Make New Sheets & Tables Based On The First Table Of The First Sheet." buttons {"Cancel", "Start"} default button 2 with icon 1
tell document 1
    -- Get A List of the Sheet Names
    set sheetNames to name of sheets
    -- Start With A Fresh Slate, No Old Sheets
    delete (every sheet whose name is not item 1 of sheetNames)
    tell sheet 1
        -- Grab and Set Future Header Values
        set columnHeaders to value of cell of row 1 in table 1
        -- Display A List Of Possible Choices To Create New Sheets With From The List We Make Above
        set chosenColumn to choose from list columnHeaders with prompt "Which Column Do You Want To Use For New Sheets?" default items item 1 of columnHeaders
        set chosenColumn to chosenColumn as text
        tell table 1
            -- Remove All Empty Rows to Help Prevent Error In Script
            set {row_count, col_count} to {count rows, count columns}
            set blank_row to {}
            repeat with x from 1 to col_count
                set blank_row to blank_row & missing value
            end repeat
            set x to 1
            -- Delete Empty Rows In Reverse, It's Logical
            repeat with y from row_count to 1 by -1
                set row_values to value of cells of row y
                if row_values = blank_row then delete row y
            end repeat

            -- Grab A List of All Divisions for Future Use Depending on Choice From Prompt, excluding the First Row Which Is A Header. If You Selected The First Column, We Have to Handle That Differently
            if chosenColumn is item 1 of columnHeaders then
                set theDivisions to the value of every cell of column "A" whose value is not chosenColumn
            else
                set theDivisions to the value of every cell of column named chosenColumn whose value is not chosenColumn
            end if

        end tell
    end tell
    -- Start the New "Sheet Making" Loop
    repeat with division in theDivisions
        -- Make An Empty Blank List At the Start of Every Loop
        set matchingDivisions to {}
        tell table 1 of sheet 1

            -- Get All Rows Matching the Current Division of the Loop We Are On, to Make New Tables With Later
            repeat with x from 1 to count of cells
                if the value of cell x is division then
                    -- Put All Data About the Rows We Gathered Above Into the Empty List We Made 
                    set the end of matchingDivisions to value of cells of row of cell x
                end if
            end repeat
            -- Reset x, Because I'm Not Creative and Want to Use It Later
            set x to 1
        end tell
        -- If The Sheet Of the Division We Are On, of the Loop, Doesn't Exist, Make It
        if not (exists sheet division) then
            make new sheet with properties {name:division}
            tell sheet division
                -- Start With A Fresh Slate On This New Sheet
                delete every table
                -- Make the Table With All Relevant Parameters 
                set currentDivisionTable to make new table with properties ¬
                    {row count:((count of matchingDivisions) + 1), column count:count of item 1 of matchingDivisions, name:division}
                tell currentDivisionTable
                    set x to 1
                    -- Set The Header Values from A List We Created Earlier
                    repeat with theHeader in columnHeaders
                        set the value of cell x to theHeader
                        set x to (x + 1)
                    end repeat
                    -- Reset x Again, I'm Lazy
                    set x to 1
                    -- Set Starting Point to Start Filling The Table, Compensate For Our Headers
                    set rowIndex to 1
                    set columnIndex to 0
                    -- Start Filling The Table With Data, Which Comes From The List Earlier
                    repeat with x from 1 to count of the matchingDivisions
                        set rowData to item x of the matchingDivisions
                        tell row (rowIndex + x)
                            repeat with i from 1 to the count of rowData
                                tell cell (columnIndex + i)
                                    set value to item i of rowData
                                end tell
                            end repeat
                        end tell
                    end repeat
                end tell
            end tell
        end if
    end repeat
    -- Return To the First Sheet
    set the active sheet to the first sheet
    -- Display Notification That The Tables Are Done Being Made -- OPTIONAL
    display notification "Processing is complete." with title "Numbers Table Converter" subtitle "All Tables Have Been Made." sound name "Hero"
end tell
end tell

Полный код изменен ниже:

        set {begCol, endCol} to {2, 17}
        set tgtCol to 1

        tell application "Numbers"
            tell front sheet of front document
                tell active sheet
                    set getVal to rows's cells's value
                    set myOriginalTable to front table
                    set itemCode to {"CardNo", "SAL-DAY", "OT15-Money", 
    "OT2-Money", "OT3-Money", "OTHINC", "P0007", "DILIG", "P0004", "P0003", 
    "SEV_SPE", "P0011", "SI-SSF", "TI-TAXITEM", "P0022", "P0021", "P0025"} -- 
    change to variable 
                    set Amount to {"CardNo", "SAL-DAY", "OT15-Money", 
    "OT2-Money", "OT3-Money", "OTHINC", "P0007", "DILIG", "P0004", "P0003", 
    "SEV_SPE", "P0011", "SI-SSF", "TI-TAXITEM", "P0022", "P0021", "P0025"} -- 
    change to variable 
                    set setCols to 8
                end tell
                set myNewTable to make new table with properties ¬
                    {column count:setCols, row count:(count of itemCode) + 1, 
header column count:0}
                tell myNewTable
                    set value of cell 1 of column "A" to "cardNo"
                    set value of cell 1 of column "B" to "emCode"
                    set value of cell 1 of column "C" to "emName"
                    set value of cell 1 of column "D" to "itemCode"
                    set value of cell 1 of column "E" to "itemName"
                    set value of cell 1 of column "F" to "effDate"
                    set value of cell 1 of column "G" to "amt"
                    set value of cell 1 of column "H" to "remark"
                    set x to 2
                    repeat with eachAmount in Amount
                        set value of cell x of column "G" to eachAmount
                        set x to (x + 1)
                    end repeat
                    set x to 2
                    repeat with eachItemCode in itemCode
                        set value of cell x of column "D" to eachItemCode
                        set x to (x + 1)
                    end repeat
                end tell
            end tell
        end tell

Спасибо

Пытаться

set thisSheet to make new sheet with properties  {name:"yourname"}

Отредактируйте некоторые объяснения: если вы боретесь с тем, как обращаться к сторонним приложениям, попробуйте загрузить их библиотеку и найти нужные вам методы. В редакторе яблочного сценария вы найдете его в (я думаю) меню. Затем выберите нужное приложение, чтобы получить библиотеку

Согласно исходному коду выше. Я нашел другой способ использования диапазона выбора для определения данных. Но это все равно неверно, потому что код забирает все данные в одну ячейку, как это. результат после запуска скрипта

Может ли кто-нибудь предложить мне?

try
    tell application "Numbers" to tell front document to tell active sheet
        set delimiter to ","
        set selected_table to first table whose class of selection range is range
        tell selected_table
            set my_selection to the selection range
            set begCol to address of first column of my_selection
            set endCol to address of last column of my_selection
            set begRow to address of first row of my_selection
            set endRow to address of last row of my_selection
            set getVal to ""
            repeat with j from begRow to endRow
                repeat with i from begCol to endCol
                    set getVal to (getVal & (value of cell j of column i of selected_table) as text) & delimiter

                    set getVal to getVal & return
                end repeat
            end repeat
        end tell
    end tell

    set AmountVal to {getVal}

    tell application "Numbers"
        activate
        tell front sheet of front document
            set myOriginalTable to front table
            set setCols to 8
            set myNewTable to make new table with properties ¬
                {row count:(count of AmountVal) + 1, column count:setCols, header column count:0}
            tell myNewTable
                set value of cell 1 of column "A" to "cardNo"
                set value of cell 1 of column "B" to "emCode"
                set value of cell 1 of column "C" to "emName"
                set value of cell 1 of column "D" to "itemCode"
                set value of cell 1 of column "E" to "itemName"
                set value of cell 1 of column "F" to "effDate"
                set value of cell 1 of column "G" to "amt"
                set value of cell 1 of column "H" to "remark"

                set x to 2
                repeat with eachAmount in AmountVal
                    set value of cell x of column "G" to eachAmount
                    set x to (x + 1)
                end repeat
            end tell
        end tell
    end tell

    display notification "Already Done!" with title "Numbers"
on error
    display dialog "Select a range first and then try again"
end try
Другие вопросы по тегам