I. Introduction▲
Lorsque du travail sur des documents, il est parfois nécessaire de convertir des listes numérotées en tableaux pour améliorer la lisibilité. L’exécution manuelle de cette tâche peut prendre beaucoup de temps. Les macros ONLYOFFICE permettent aux utilisateurs d’automatiser efficacement les tâches répétitives. Dans ce tutoriel, nous allons expliquer comment développer étape par étape une macro ONLYOFFICE qui transforme de manière transparente les listes numérotées en tableaux structurés.
II. Construction de la macro▲
II-A. Récupération du document et des paragraphes numérotés▲
La macro commence par accéder au document actif et récupère tous les paragraphes qui contiennent une numérotation :
const oDocument =
Api.GetDocument
(
);
const paragraphs =
oDocument.GetAllNumberedParagraphs
(
);
Dans ce code, les paramètres exécutent les actions suivantes :
- Api
.GetDocument
(
) récupère le document actuellement ouvert. - oDocument
.GetAllNumberedParagraphs
(
) rassemble tous les paragraphes qui utilisent des styles de numérotation.
II-B. Organisation des éléments numérotés en lignes▲
Le script parcourt chaque paragraphe numéroté et les trie dans les lignes du tableau :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
let tableData =
[];
let currentRow =
[];
for (
let i =
0
;
i <
paragraphs.
length;
i++
) {
let level =
paragraphs[
i]
.GetNumbering
(
).GetLevelIndex
(
);
let text
=
paragraphs[
i]
.GetText
(
).trim
(
);
if (
level ===
0
) {
if (
currentRow.
length >
0
) {
tableData.push
(
currentRow);
}
currentRow =
[
text
];
}
else if (
level ===
1
&&
currentRow.
length >
0
) {
currentRow.push
(
text
);
}
}
if (
currentRow.
length >
0
) {
tableData.push
(
currentRow);
}
- Le script parcourt en boucle tous les paragraphes et vérifie leur niveau de numérotation.
- Les éléments de niveau 0 commencent une nouvelle ligne, tandis que les éléments de niveau 1 sont ajoutés en tant que colonnes dans la ligne actuelle.
- Après traitement, toutes les lignes rassemblées sont stockées dans tableData.
II-C. Détermination des dimensions du tableau▲
Avant de créer le tableau, la macro détermine le nombre de colonnes nécessaires. Le script calcule maxColumns en trouvant la ligne la plus longue dans tableData. Cela permet de s’assurer que le tableau comporte suffisamment de colonnes pour accueillir correctement tous les éléments :
II-D. Création et remplissage du tableau▲
Maintenant que les données sont organisées, la macro crée une table et y insère le contenu extrait :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
let table =
Api.CreateTable
(
maxColumns,
tableData.
length);
oDocument.Push
(
table);
for (
let row =
0
;
row <
tableData.
length;
row++
) {
for (
let col =
0
;
col <
tableData[
row].
length;
col++
) {
table
.GetCell
(
row,
col)
.GetContent
(
)
.GetElement
(
0
)
.AddText
(
tableData[
row][
col]
);
}
}
- Api
.CreateTable
(
maxColumns,
tableData.
length) crée un tableau aux dimensions requises. - Le script parcourt en boucle tableData et insère le texte correspondant dans chaque cellule.
II-E. Traitement des erreurs▲
Pour garantir une exécution sans heurts, un bloc try…catch est utilisé pour détecter et enregistrer les erreurs. Si une erreur se produit, elle est enregistrée dans la console, ce qui aide les utilisateurs à résoudre les problèmes :
II-F. Code complet de la macro▲
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
const oDocument =
Api.GetDocument
(
);
const paragraphs =
oDocument.GetAllNumberedParagraphs
(
);
let tableData =
[];
let currentRow =
[];
for (
let i =
0
;
i <
paragraphs.
length;
i++
) {
let level =
paragraphs[
i]
.GetNumbering
(
).GetLevelIndex
(
);
let text
=
paragraphs[
i]
.GetText
(
).trim
(
);
if (
level ===
0
) {
if (
currentRow.
length >
0
) {
tableData.push
(
currentRow);
}
currentRow =
[
text
];
}
else if (
level ===
1
&&
currentRow.
length >
0
) {
currentRow.push
(
text
);
}
}
if (
currentRow.
length >
0
) {
tableData.push
(
currentRow);
}
let maxColumns =
0
;
for (
let j =
0
;
j <
tableData.
length;
j++
) {
if (
tableData[
j].
length >
maxColumns) {
maxColumns =
tableData[
j].
length;
}
}
let table =
Api.CreateTable
(
maxColumns,
tableData.
length);
oDocument.Push
(
table);
for (
let row =
0
;
row <
tableData.
length;
row++
) {
for (
let col =
0
;
col <
tableData[
row].
length;
col++
) {
table
.GetCell
(
row,
col)
.GetContent
(
)
.GetElement
(
0
)
.AddText
(
tableData[
row][
col]
);
}
}
try {
// Code execution
}
catch (
error) {
console.log
(
"Error: "
+
error.
message);
}
III. Ressources utiles▲
IV. Remerciements Developpez.com▲
Nous tenons à remercier Malick pour la mise au gabarit.