Possible d'automatiser le regroupement de lignes dans un classeur (Outline) avec Scriptforge?

Bonjour,

Je viens de créer un script Python à l’aide de Scriptforge pour générer une feuille de classeur à partir d’informations contenues dans un fichier texte. Tout fonctionne bien.

J’aimerais maintenant pouvoir automatiser le regroupement de certaines lignes de cette feuille de calcul (comme en allant dans Données > Plan et groupe > Grouper) mais ne trouve pas comment faire.

Les lignes à regrouper sont les 9 dernières lignes du template de 10 lignes que je copie pour chaque voie dans la fonction fill_route().

J’ai lu dans OOME 4.1, section 15.5.3, des éléments en rapport. Ce qui pointe vers :
[LibreOffice: XSheetOutline Interface Reference]. Malheureusement, je n’ai pas les clés pour comprendre les interactions entre les objets scriptforge et cette documentation.

Comment puis-je procéder ?

Un grand merci par avance.

from scriptforge import CreateScriptService

CRAG_INFO_URL = '/home/louberehc/veille_aouste/voies/Anse.txt'
TEMPLATE_DOC_URL = '/home/louberehc/veille_aouste/template.ods'

#### FUNCTIONS
def get_info_type(text: str) -> str:
    """Qualify the text information."""
    if text.startswith("Secteur"):
        return "Secteur"
    elif text.startswith('-'):
        return "Voie"
    elif text.startswith('\n'):
        return "Saut de ligne"
    else:
        return "Inconnu"

def fill_sector(doc, text_input, current_row):
    # Write the sector name in the A column.
    doc.setValue(
        f"A{current_row}",
        text_input.removeprefix("Secteur ")
    )
    current_row += 1
    return current_row

def fill_route(doc, route_range, text_input, current_row):
    # Copy the table to track route observations.
    doc.copyToCell(route_range, f"B{current_row}")
    # Rectify the route name in the B column.
    doc.setValue(
        f"B{current_row}",
        text_input.removeprefix("- ")
    )
    current_row += 10
    return current_row  
    
def fill_spreadsheet(doc, route_range, text_input: str, current_row: int):
    """ 
    - Fill the spreadsheet according the text input type.
    - Track the row number of the 'cursor'.
    
    # Args :
        - input : a text line
        - current row : the line number where to write information in
        the sheet.
        
    # Return :
        The next row to write to.
    """
    match get_info_type(text_input):
        case "Secteur":
            current_row = fill_sector(doc, text_input, current_row)
        case "Voie":
            current_row = fill_route(doc, route_range, text_input, current_row)
        case "Saut de ligne":
            current_row += 1 
        case _:
            pass
    return current_row


#### MACROS
def create_Anse_sheet(args=None):
    # Get the open spreadsheet
    doc = CreateScriptService("Calc")
    # Get 2 templates which will be copied many times in the spreadsheet
    svc = CreateScriptService("UI")
    source_doc = svc.getDocument(TEMPLATE_DOC_URL)
    header_range = source_doc.Range("Feuille1.A1:G2")
    route_range = source_doc.Range("Feuille1.B4:O13")
    
    # Fill the header
    doc.copyToCell(header_range, "A1") 
    current_row = 3
    # Loop on the information about the crag.
    with open(CRAG_INFO_URL, 'r') as crag_info:
        for line in crag_info:
            # Fill the spreadsheet according to the text input type and 
            # update the row position to write next info
            current_row = fill_spreadsheet(
                doc,
                route_range,
                line,
                current_row
            )
            

g_exportedScripts = (
    create_Anse_sheet,
)

et un extrait du contenu de Anse.txt

Secteur Baraka
- Le puit des sept nains
- Alcootest
- Tac (gauche)
- Tac (droite)
- Akekepart (gauche)
- Akekepart (droite)
- Cacaboum
- Assurance tous risques
- Japet
- Mylène, je t'aime
- Boisot

Secteur Dopage
- Monsieur Propre
- Boisage
- Le nom des dieux
- Virage dangereux
- Stratopelle
- Stratopause
- La planque des hirondelles
- De gouttes en gouttes
- Les devins
- Dopage autorisé
- Dopage autorisé à max

Secteur Karine
- Karine au Verdon
- L'avenir du démon
- La boutonnière
- Le chat pelé
- I am Saury
- Agripine
- Robertissime
- Cul de sac
- La griffe du Sauryen
- Bourin mental firect
- Bourin mental
- Empreinte Digitale

template.ods (23.5 KB)

Bonjour!
Pour comprendre et tester le code, il serait certainement très utile que tu nous donnes les deux fichiers:
…/Anse.txt et …/template.ods. (Veuillez les joindre au message de départ) Merci!

Heureusement, Scriptforge n’est certainement pas nécessaire pour résoudre ce problème!

Merci de vous intéresser à mon problème !

J’ai édité le message original.

Je souhaite obtenir exactement la même chose que dans le fichier template.ods (avec la possibilité de dérouler / réduire les tableaux d’observation pour chaque voie). Pour beaucoup plus de voies…