2017-10-03 1 views
1

J'essaie d'insérer une nouvelle ligne dans une table dans Word et de modifier le contenu des cellules de la nouvelle ligne. Le problème que je rencontre est qu'après l'insertion de la ligne, le Word api n'est pas capable de trouver des cellules dans la nouvelle ligne. Ci-dessous j'ai ajouté une version très simplifiée de mon code.Table.getCell() ne fonctionne pas sur la cellule dans la ligne nouvellement insérée

await Word.run(async(context) => { 
    let table = context.document.body.tables.getFirstOrNullObject(); 
    context.load(table, { 
     expand: "rows/items/cells/items/body" 
    }) 
    await context.sync(); 

    let row = table.rows.items[table.rowCount - 1]; 
    row.insertRows("After", 1); 
    await context.sync(); 

    let cell = table.getCell(2, 0); //throws "ItemNotFound" exception 
    cell.body.insertText("test", "Replace"); 

    await context.sync(); 
}); 

Existe-t-il un moyen de faire fonctionner cela ou est-ce un bug?

(s'il vous plaît ne suggèrent pas l'aide du paramètre valeurs sur la ligne d'insertion comme mon code actuel est beaucoup plus compliqué)

Répondre

0

La raison pour laquelle cela se produit est que vous ne l'avez pas rechargé l'objet table. Vous devez dire à l'API de recharger explicitement table avant la sync() ramassera cette demande:

let row = table.rows.items[table.rowCount - 1]; 
row.insertRows("After", 1); 
context.load(table, {expand: "rows/items/cells/items/body"}); 
await context.sync(); 

Une autre façon d'aborder ce serait de charger juste la ligne que vous avez ajouté plutôt que de recharger la table entière. Vous pouvez le faire en chargeant le tableRowCollection retourné par insertRows():

let newRows = row.insertRows("After", 1); 
context.load(newRows, { expand: "items/cells/items/body" }); 
await context.sync(); 
newRows.items[0].cells.items[0].body.insertText("test", "Replace"); 
+0

J'ai déjà essayé cela et n'a pas résolu la question. Des informations supplémentaires sont que j'ai initialement une table de 2 lignes et que vous voulez modifier une cellule dans la dernière (nouvelle) ligne – Nick

+0

Odd. J'ai été capable de répliquer votre bug dans ScriptLab. Ajouter 'context.load (table, {expand:" lignes/items/cells/items/body "});' avant d'appeler 'sync()' l'a résolu. Avez-vous eu la même erreur après avoir ajouté cette ligne? –

+0

Oui, mais lorsque j'ai plus de 2 lignes dans ma table initiale dans mon document, cela fonctionne bien. J'ai fait quelques tests supplémentaires et votre deuxième suggestion fonctionne pour moi (en chargeant la ligne nouvellement ajoutée). Le chargement de la table entière et l'obtention d'une cellule de la ligne nouvellement ajoutée à partir du niveau de la table ne fonctionne pas. – Nick