# Applescript et Numbers



## Jalex07 (27 Mars 2022)

Bonjour, 
Je débute avec Applescript et je voudrais écrire un script capable de récupérer la ligne et la colonne de la cellule active dans un fichier Numbers.
J'ai déjà réussi à lire et à écrire dans une cellule mais à condition de connaître son nom ("A2", "B5" ...). Mais comment faire pour obtenir la cellule sélectionnée dans le fichier ?
Si quelqu'un peut m'aider ...
Merci d'avance.


----------



## zeltron54 (27 Mars 2022)

Bonjour,

Pour obtenir la sélection dans numbers il faut:
Set LaSelection to selection range

exemple:


```
tell application "Numbers"
    activate
    tell the first table of the active sheet of document 1
        set LaSelection to selection range
        set Lacellule to name of cell of LaSelection as string
        display dialog Lacellule
    end tell
end tell
```

Si plusieurs cellules sont sélectionnées tu ajoutes le numéro d'ordre de la cellule recherchée

Exemple: pour obtenir le nom de la deuxième cellule de la sélection



```
tell application "Numbers"
    activate
    tell the first table of the active sheet of document 1
        set LaSelection to selection range
        set Lacellule to name of cell 2 of LaSelection as string
        display dialog Lacellule
    end tell
end tell
```


----------



## Jalex07 (28 Mars 2022)

zeltron54 a dit:


> Bonjour,
> 
> Pour obtenir la sélection dans numbers il faut:
> Set LaSelection to selection range
> ...


Bonjour et merci pour cette réponse rapide !
Malheureusement cela me donne une erreur lorsque je l'utilise : Il est impossible d’obtenir selection range of "C". ??


----------



## zeltron54 (28 Mars 2022)

Bonjour,

Comment procèdes-tu  ? car chez moi pas de problème

Faire un simple copié-collé du code dans une fenêtre de "Editeur de script".
Ouvrir Numbers, dans le document Numbers , sélectionner une cellule.

Exécuter le script, une fenêtre dialogue s'ouvre avec le nom de la cellule sélectionnée.


----------



## Jalex07 (29 Mars 2022)

zeltron54 a dit:


> Bonjour,
> 
> Comment procèdes-tu  ? car chez moi pas de problème
> 
> ...


Oui merci. J'avis voulu mettre le nom du document (à la place de document 1) et j'avais fait une erreur. Maintenant ça marche. Encore merci.

J'aurais une autre question. Est-il possible d'utiliser un script pour trier une zone du fichier (type range) selon l'ordre croissant d'une de ses colonnes?


----------



## zeltron54 (29 Mars 2022)

Bonjour,

Quelques précisions !

set LaSelection to selection range --récupère dans la variable LaSelection le chemin de la sélection

set Lacellule to name of cell of LaSelection --récupère dans la variable Lacellule le nom de la cellule sélectionnée si plusieurs cellules récupère le nom des cellules dans la variable au format liste. Pour l'afficher mettre la variable au format texte (as string). Si on veux le nom d'une cellule de la sélection il faut préciser le numéro d'ordre  dans la sélection

set Maselection to name of LaSelection --récupère dans la variable Maselection le nom des cellules au format tableau (si la sélection est de B4 à C5 --> B4:C5


----------



## zeltron54 (29 Mars 2022)

Bonsoir,

Quand tu es dans l'éditeur de script tu ouvres le dictionnaire (-->fichier-->ouvrir le dictionnaire) tu choisis Numbers, tu trouveras les possibilités de scripts (syntaxe pas évidente , mais bon!) tu pourras voir pour le tri:

sort v : Sort the rows of the table.
sort table
by column : The column to sort by.
[direction ascending/‌descending]
[in rows range] : Limit the sort to the specified rows.

Note: Curieusement je ne vois tes messages que tard le soir, alors qu'il sont datés du matin (8h17) !!!


----------



## zeltron54 (30 Mars 2022)

Bonjour,

Au vue des explications du dictionnaire de Numbers, pour trier.


```
set selection range to range "a14:e37" -- selectionne les cellules à trier exemple: le tableau de A14 à E37
        set LaSelection to selection range --obtient le chemin de la sélection
        sort by column "A" direction descending in rows LaSelection   -- descending pour un tri décroissant ou ascending (par défaut si pas renseigné) pour un tri croissant) de la colonne A
```

Dis moi si c'est bon !


----------



## zeltron54 (4 Avril 2022)

Bonjour,
@Jalex07 


zeltron54 a dit:


> ```
> set selection range to range "a14:e37" -- selectionne les cellules à trier exemple: le tableau de A14 à E37
> set LaSelection to selection range --obtient le chemin de la sélection
> sort by column "A" direction descending in rows LaSelection -- descending pour un tri décroissant ou ascending (par défaut si pas renseigné) pour un tri croissant) de la colonne A
> ...


J'ai testé chez moi cela fonctionne !

As-tu pu tester ?
Est-ce bon pour toi ?


----------



## Jalex07 (5 Avril 2022)

zeltron54 a dit:


> Bonjour,
> @Jalex07
> 
> J'ai testé chez moi cela fonctionne !
> ...


Oui. Merci.
Comme cela ça marche. Mais moi, ce qui m'intéresserait c'est de trouver "selection range" sans définir la sélection auparavant, càd. trouver la sélection qui est faite dans le fichier (par la choix de l'utilisateur).
Par ailleurs, je m'intéresse aussi à entrer dans un fichier "pages" et  je peux sélectionner par exemple le dernier mot du texte :
`[B]tell[/B] [I]application[/I] "Pages"
    [B]tell[/B] [I]document[/I] 1
[B]         set[/B] dernierMot [B]to[/B] [B]last[/B] [I]word[/I] [B]of[/B] body text
    [B]end[/B] [B]tell
end[/B] [B]tell[/B]`
mais je voudrais pouvoir sélectionner par exemple le dernier "titre 2" ou un mot par la taille de ses caractères.


----------



## zeltron54 (5 Avril 2022)

Pour obtenir la sélection, tu as la solution dans le message #2.
set Laselection to selection range

dans le message #9 il suffit de supprimer la 1ere ligne…


----------



## Jalex07 (5 Avril 2022)

zeltron54 a dit:


> Pour obtenir la sélection, tu as la solution dans le message #2.
> set Laselection to selection range
> 
> dans le message #9 il suffit de supprimer la 1ere ligne…


Non ça ne marche pas. 
Voici mon code :
*tell application "Numbers"
   activate
   tell table 1 of sheet 1 of document 1
      set LaSelection to selection range
   end tell
end tell*
et tout ce que j'obtiens en retour c'est {}.


----------



## zeltron54 (6 Avril 2022)

Pourtant ton code est bon et le variable laselection contient bien l'adresse de la sélection.
Pour afficher la sélection il faut récupérer le nom du chemin de la variable et lui demander de l'afficher avec un display dialog:
Ce qui donne :


```
tell application "Numbers"
    activate
    tell table 1 of sheet 1 of document 1
        set LaSelection to selection range
        set var_affiche to name of LaSelection
        display dialog var_affiche
    end tell
end tell
```


----------



## Jalex07 (6 Avril 2022)

zeltron54 a dit:


> tell application "Numbers" activate tell table 1 of sheet 1 of document 1 set LaSelection to selection range set var_affiche to name of LaSelection display dialog var_affiche end tell end tell


Je te remercie de tes réponses. 
Malheureusement, même avec cette dernière version, je n'obtiens que le message :
"Il est impossible d'obtenir name of {}"


----------



## Jalex07 (6 Avril 2022)

Jalex07 a dit:


> Je te remercie de tes réponses.
> Malheureusement, même avec cette dernière version, je n'obtiens que le message :
> "Il est impossible d'obtenir name of {}"


En fait la seule manière que j'aie d'obtenir qqch est :

*set MaTable to table 1 of sheet 1 of document 1
tell MaTable
set ligne to address of first item of  selection range
...
end tell*
Comme cela ça marche.


----------



## Jalex07 (6 Avril 2022)

Jalex07 a dit:


> En fait la seule manière que j'aie d'obtenir qqch est :
> 
> *set MaTable to table 1 of sheet 1 of document 1
> tell MaTable
> ...


Excuse!
set ligne to address of first item of rows of selection range


----------



## zeltron54 (6 Avril 2022)

Pourtant avec le code du message #13

Je fais un copié collé de ce code dans Editeur de script, J'ouvre Numbers avec un tableau vierge, dans ce tableau je sélectionne un groupe de cellules.
J'exécute le script, il me donne bien ma sélection....


----------



## zeltron54 (6 Avril 2022)

Pour t'aider voici un petit script qui t'affiche les différentes infos de la sélection. Puis le tri.


```
tell application "Numbers"
    activate
    tell the first table of the active sheet of document 1
        set LaSelection to selection range
        set Lacellule to name of cell 1 of LaSelection -- nom de la cellule 1 de la selection
        display dialog "Nom de la première cellule : " & Lacellule
        set a to name of LaSelection
        set b to name of cell of LaSelection -- liste des cellule dans une variable liste
        display dialog "Nom de la sélection : " & a -- nom de la selection
        display dialog "Liste des cellules de la sélection : " & b as string -- affiche la liste en string
    
        set colonne to name of column of cell 1 of LaSelection
        display dialog "colonne de la première cellule : " & colonne
        set ligne to address of first item of rows of selection range
        display dialog "ligne de la première cellule : " & ligne

--Pour trier
        set LaSelection to selection range --obtient le chemin de la sélection
        sort by column colonne direction descending in rows LaSelection -- descending pour un tri décroissant ou ascending (par défaut si pas renseigné) pour un tri croissant) de la première colonne de la sélection
display dialog "la sélection à été trié suivant la colonne " & colonne & " en décroissant"
    
    end tell
end tell
```

Edit: Bien sur pour le tri il faut que les cellules de la première colonne contiennent des valeurs ...


----------



## Jalex07 (6 Avril 2022)

zeltron54 a dit:


> Pour t'aider voici un petit script qui t'affiche les différentes infos de la sélection. Puis le tri.
> 
> 
> ```
> ...


Je te remercie encore de tes efforts ... mais j'ai recopié ce bloc de code, j'ai sélectionné des cellules dans un fichier numbers et j'obtiens : 
*Erreur de script 
Il est impossible d’obtenir cell 1 of {}.*


----------



## zeltron54 (6 Avril 2022)

A priori le message indique qu'il ne trouve pas le tableau.

Dans Numbers as-tu plusieurs documents ou plusieurs feuilles ou plusieurs tableaux ?

change la ligne 3 du script:
tell the first table of the active sheet of document 1
par 
tell the first table of the active sheet of front document

Qui s'occupe alors du document qui a le focus.


----------



## Jalex07 (6 Avril 2022)

zeltron54 a dit:


> A priori le message indique qu'il ne trouve pas le tableau.
> 
> Dans Numbers as-tu plusieurs documents ou plusieurs feuilles ou plusieurs tableaux ?
> 
> ...


J'ai un seul document ouvert, une seule feuille et une seule table.
Avec "the front document" le résultat est le même (càd Il est impossible d’obtenir cell 1 of {})


----------



## zeltron54 (6 Avril 2022)

Avec tous mes tests, chez moi çà fonctionne !   

Les seuls moyens que j'ai d'obtenir un message d'erreur sont

Si numbers n'est pas ouvert alors:
"Erreur dans Numbers : Il est impossible d’obtenir document 1. Index non valable."

Si rien n'est sélectionné dans le tableau  alors:
"Il est impossible d’obtenir cell 1 of missing value."

Donc vu d'ici il m'est impossible de comprendre ton problème.


----------



## zeltron54 (7 Avril 2022)

Bonjour,
Je cherche toujours une solution pour toi...
Essai avec ce script qui cible le tableau au premier plan.

1- préparation d'une feuille numbers:

Tu ouvres numbers, dans la fenêtre choisir un modèle tu choisis vierge.
Dans la feuille qui s'ouvre, tu entres des valeurs quelconques dans 4 cellules d'une colonne  (par exemple en C4, C5, C6, C7).
Tu sélectionnes les cellules de C4 à E7

2- préparation du script
Tu ouvres Editeur de script
Tu choisis nouveau document
Tu fais un copié de ce script dans cette fenêtre
tu t'assures que dans numbers les cellules sont toujours sélectionnées
Puis tu exécutes le script

Dis moi si là cela fonctionne


```
tell application "Numbers"
    activate
    tell front table of front sheet of front document
        set LaSelection to selection range
        set Lacellule to name of cell 1 of LaSelection -- nom de la cellule 1 de la selection
        display dialog "Nom de la première cellule : " & Lacellule
        set a to name of LaSelection
        set b to name of cell of LaSelection -- liste des cellule dans une variable liste
        display dialog "Nom de la sélection : " & a -- nom de la selection
        display dialog "Liste des cellules de la sélection : " & b as string -- affiche la liste en string
       
        set colonne to name of column of cell 1 of LaSelection
        display dialog "colonne de la première cellule : " & colonne
        set ligne to address of first item of rows of selection range
        display dialog "ligne de la première cellule : " & ligne
       
        --Pour trier
        set LaSelection to selection range --obtient le chemin de la sélection
        sort by column colonne direction descending in rows LaSelection -- descending pour un tri décroissant ou ascending (par défaut si pas renseigné) pour un tri croissant) de la colonne A
        display dialog "la sélection à été trié suivant la colonne " & colonne & " en décroissant"
       
    end tell
end tell
```


----------

