From 18ac30ce219f1aa362cff3eb223522655dd92113 Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Fri, 4 Apr 2025 14:06:47 -0700 Subject: [PATCH 1/6] [Word] Add snippets for APIs re pages, panes, windows --- playlists-prod/word.yaml | 9 + playlists/word.yaml | 9 + samples/word/35-ranges/get-pages.yaml | 244 ++++++++++++++++++++++++++ view-prod/word.json | 1 + view/word.json | 1 + 5 files changed, 264 insertions(+) create mode 100644 samples/word/35-ranges/get-pages.yaml diff --git a/playlists-prod/word.yaml b/playlists-prod/word.yaml index 0a4b1d01..8f717183 100644 --- a/playlists-prod/word.yaml +++ b/playlists-prod/word.yaml @@ -337,6 +337,15 @@ group: Ranges api_set: WordApi: '1.3' +- id: word-ranges-get-pages + name: 'Work with pages, panes, and windows' + fileName: get-pages.yaml + description: 'Shows how to work with pages, panes, and windows APIs.' + rawUrl: >- + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + group: Ranges + api_set: + WordApiDesktop: '1.2' - id: word-tables-table-cell-access name: Create and access a table fileName: table-cell-access.yaml diff --git a/playlists/word.yaml b/playlists/word.yaml index a934f0e6..a64d92d3 100644 --- a/playlists/word.yaml +++ b/playlists/word.yaml @@ -337,6 +337,15 @@ group: Ranges api_set: WordApi: '1.3' +- id: word-ranges-get-pages + name: 'Work with pages, panes, and windows' + fileName: get-pages.yaml + description: 'Shows how to work with pages, panes, and windows APIs.' + rawUrl: >- + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/get-pages.yaml + group: Ranges + api_set: + WordApiDesktop: '1.2' - id: word-tables-table-cell-access name: Create and access a table fileName: table-cell-access.yaml diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml new file mode 100644 index 00000000..bcd091ef --- /dev/null +++ b/samples/word/35-ranges/get-pages.yaml @@ -0,0 +1,244 @@ +order: 4 +id: word-ranges-get-pages +name: 'Work with pages, panes, and windows' +description: 'Shows how to work with pages, panes, and windows APIs.' +author: yilin4 +host: WORD +api_set: + WordApiDesktop: '1.2' +script: + content: | + $("#get-pages-selected-range").on("click", () => tryCatch(getPagesOfSelectedRange)); + $("#get-pages-third-paragraph").on("click", () => tryCatch(getPagesOfThirdParagraph)); + $("#get-pages-enclosing-viewport").on("click", () => tryCatch(getPagesEnclosingViewport)); + $("#get-all-pages").on("click", () => tryCatch(getAllPages)); + $("#setup").on("click", () => tryCatch(setup)); + + async function getPagesOfSelectedRange() { + await Word.run(async (context) => { + // Gets pages of the selection. + const pages = context.document.getSelection().pages; + pages.load(); + await context.sync(); + + console.log(pages); + // Log info for pages included in selection. + for (let i = 0; i < pages.items.length; i++) { + let page = pages.items[i]; + page.load(); + await context.sync(); + + console.log(`Index info for page ${i + 1} in the selection: ${page.index}`); + const range = page.getRange(); + range.load(); + await context.sync(); + + console.log("Text of that page in the selection:", range.text); + } + }); + } + + async function getPagesOfThirdParagraph() { + await Word.run(async (context) => { + // Gets the pages that the third paragraph is found on. + const paragraphs = context.document.body.paragraphs; + paragraphs.load(); + await context.sync(); + + const paraThree = paragraphs.items[2]; + const rangeOfParagraph = paraThree.getRange(); + await context.sync(); + + const pages = rangeOfParagraph.pages; + pages.load(); + await context.sync(); + + console.log(pages); + // Log into for pages in range. + for (let i = 0; i < pages.items.length; i++) { + let page = pages.items[i]; + page.load(); + await context.sync(); + + console.log(`Index of page ${i + 1} that the third paragraph is found on: ${page.index}`); + const range = page.getRange(); + range.load(); + await context.sync(); + + console.log("Text of that page:", range.text); + } + }); + } + + async function getPagesEnclosingViewport() { + await Word.run(async (context) => { + // Gets the pages enclosing the viewport. + + // Get the active window. + let activeWindow = context.document.activeWindow; + activeWindow.load(); + await context.sync(); + + // Get the active pane. + let activePane = activeWindow.activePane; + activePane.load(); + await context.sync(); + // Get pages enclosing the viewport. + let pages = activePane.pagesEnclosingViewport; + pages.load(); + await context.sync(); + + // Log the number of pages. + let pageCount = pages.items.length; + console.log(`Number of pages enclosing the viewport: ${pageCount}`); + // Log index info of these pages. + for (let i = 0; i < pages.items.length; i++) { + let page = pages.items[i]; + page.load(); + await context.sync(); + + console.log(`Page index: ${page.index}`); + } + await context.sync(); + }); + } + + async function getAllPages() { + await Word.run(async (context) => { + // Gets the first paragraph of each page. + console.log("Getting first paragraph of each page..."); + + // Get the active window. + let activeWindow = context.document.activeWindow; + activeWindow.load(); + await context.sync(); + + // Get the active pane. + let activePane = activeWindow.activePane; + activePane.load(); + await context.sync(); + + // Get all pages. + let pages = activePane.pages; + pages.load(); + await context.sync(); + + // Get page index and paragraphs of each page. + for (let i = 0; i < pages.items.length; i++) { + // Get page index of the page. + let page = pages.items[i]; + page.load(); + await context.sync(); + + console.log(`Page index: ${page.index}`); + await context.sync(); + + // Get paragraphs of the page. + const range = page.getRange(); + range.load(); + let paragraphs = range.paragraphs; + paragraphs.load(); + await context.sync(); + + // Log the number of paragraphs on the page. + let paragraphsCount = paragraphs.items.length; + await context.sync(); + console.log(`Number of paragraphs: ${paragraphsCount}`); + // Log the first paragraph of the page. + let firstParagraph = paragraphs.items[0]; + firstParagraph.load(); + await context.sync(); + + console.log("First paragraph's text:", firstParagraph.text); + } + }); + } + + async function setup() { + await Word.run(async (context) => { + const body: Word.Body = context.document.body; + body.clear(); + body.insertBreak(Word.BreakType.page, Word.InsertLocation.end); + body.insertParagraph( + "Themes and styles also help keep your document coordinated. When you click design and choose a new Theme, the pictures, charts, and SmartArt graphics change to match your new theme. When you apply styles, your headings change to match the new theme.", + "End" + ); + body.insertText( + "Save time in Word with new buttons that show up where you need them. To change the way a picture fits in your document, click it and a button for layout options appears next to it. When you work on a table, click where you want to add a row or a column, and then click the plus sign.", + "Start" + ); + body.insertParagraph( + "Do you want to create a solution that extends the functionality of Word? You can use the Office Add-ins platform to extend Word clients running on the web, on a Windows desktop, or on a Mac.", + "Start" + ); + body.paragraphs + .getLast() + .insertText( + "Use add-in commands to extend the Word UI and launch task panes that run JavaScript that interacts with the content in a Word document. Any code that you can run in a browser can run in a Word add-in. Add-ins that interact with content in a Word document create requests to act on Word objects and synchronize object state.", + "Replace" + ); + }); + } + + // Default helper for invoking an action and handling errors. + async function tryCatch(callback) { + try { + await callback(); + } catch (error) { + // Note: In a production add-in, you'd want to notify the user through your add-in's UI. + console.error(error); + } + } + language: typescript +template: + content: |- +
+ This sample demonstrates how to work with the pages, panes, and windows APIs. +
+
+

Set up

+ +
+
+

Try it out

+ + + + +
+ language: html +style: + content: |- + section.samples { + margin-top: 20px; + } + + section.samples .ms-Button, section.setup .ms-Button { + display: block; + margin-bottom: 5px; + margin-left: 20px; + min-width: 80px; + } + language: css +libraries: | + https://appsforoffice.microsoft.com/lib/1/hosted/office.js + @types/office-js + + office-ui-fabric-core@11.1.0/dist/css/fabric.min.css + office-ui-fabric-js@1.5.0/dist/css/fabric.components.min.css + + core-js@2.4.1/client/core.min.js + @types/core-js + + jquery@3.1.1 + @types/jquery@3.3.1 \ No newline at end of file diff --git a/view-prod/word.json b/view-prod/word.json index 91af0634..72709dc7 100644 --- a/view-prod/word.json +++ b/view-prod/word.json @@ -34,6 +34,7 @@ "word-ranges-scroll-to-range": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/scroll-to-range.yaml", "word-ranges-split-words-of-first-paragraph": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/split-words-of-first-paragraph.yaml", "word-ranges-compare-location": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/compare-location.yaml", + "word-ranges-get-pages": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml", "word-tables-table-cell-access": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/40-tables/table-cell-access.yaml", "word-tables-manage-formatting": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/40-tables/manage-formatting.yaml", "word-tables-manage-custom-style": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/40-tables/manage-custom-style.yaml", diff --git a/view/word.json b/view/word.json index 3d5b2baf..1bcd2b65 100644 --- a/view/word.json +++ b/view/word.json @@ -34,6 +34,7 @@ "word-ranges-scroll-to-range": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/scroll-to-range.yaml", "word-ranges-split-words-of-first-paragraph": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/split-words-of-first-paragraph.yaml", "word-ranges-compare-location": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/compare-location.yaml", + "word-ranges-get-pages": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/get-pages.yaml", "word-tables-table-cell-access": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/40-tables/table-cell-access.yaml", "word-tables-manage-formatting": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/40-tables/manage-formatting.yaml", "word-tables-manage-custom-style": "https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/40-tables/manage-custom-style.yaml", From 4c5fc00e116dc942be80f64dc19fa8bdffd73c8e Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Fri, 4 Apr 2025 14:15:00 -0700 Subject: [PATCH 2/6] Note some types --- samples/word/35-ranges/get-pages.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml index bcd091ef..970b7304 100644 --- a/samples/word/35-ranges/get-pages.yaml +++ b/samples/word/35-ranges/get-pages.yaml @@ -17,7 +17,7 @@ script: async function getPagesOfSelectedRange() { await Word.run(async (context) => { // Gets pages of the selection. - const pages = context.document.getSelection().pages; + const pages: Word.PageCollection = context.document.getSelection().pages; pages.load(); await context.sync(); @@ -41,7 +41,7 @@ script: async function getPagesOfThirdParagraph() { await Word.run(async (context) => { // Gets the pages that the third paragraph is found on. - const paragraphs = context.document.body.paragraphs; + const paragraphs: Word.ParagraphCollection = context.document.body.paragraphs; paragraphs.load(); await context.sync(); @@ -49,7 +49,7 @@ script: const rangeOfParagraph = paraThree.getRange(); await context.sync(); - const pages = rangeOfParagraph.pages; + const pages: Word.PageCollection = rangeOfParagraph.pages; pages.load(); await context.sync(); @@ -84,7 +84,7 @@ script: activePane.load(); await context.sync(); // Get pages enclosing the viewport. - let pages = activePane.pagesEnclosingViewport; + let pages: Word.PageCollection = activePane.pagesEnclosingViewport; pages.load(); await context.sync(); @@ -119,7 +119,7 @@ script: await context.sync(); // Get all pages. - let pages = activePane.pages; + let pages: Word.PageCollection = activePane.pages; pages.load(); await context.sync(); @@ -136,7 +136,7 @@ script: // Get paragraphs of the page. const range = page.getRange(); range.load(); - let paragraphs = range.paragraphs; + let paragraphs: Word.ParagraphCollection = range.paragraphs; paragraphs.load(); await context.sync(); From a421206686d52946ddf621da3551f5fb26d16826 Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Wed, 23 Apr 2025 09:00:29 -0700 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: Alex Jerabek <38896772+AlexJerabek@users.noreply.github.com> --- samples/word/35-ranges/get-pages.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml index 970b7304..f7e67ae2 100644 --- a/samples/word/35-ranges/get-pages.yaml +++ b/samples/word/35-ranges/get-pages.yaml @@ -1,7 +1,7 @@ order: 4 id: word-ranges-get-pages name: 'Work with pages, panes, and windows' -description: 'Shows how to work with pages, panes, and windows APIs.' +description: 'Shows how to work with pages, panes, and windows.' author: yilin4 host: WORD api_set: @@ -40,7 +40,7 @@ script: async function getPagesOfThirdParagraph() { await Word.run(async (context) => { - // Gets the pages that the third paragraph is found on. + // Gets the pages that contain the third paragraph. const paragraphs: Word.ParagraphCollection = context.document.body.paragraphs; paragraphs.load(); await context.sync(); @@ -75,7 +75,7 @@ script: // Gets the pages enclosing the viewport. // Get the active window. - let activeWindow = context.document.activeWindow; + const activeWindow = context.document.activeWindow; activeWindow.load(); await context.sync(); @@ -83,6 +83,7 @@ script: let activePane = activeWindow.activePane; activePane.load(); await context.sync(); + // Get pages enclosing the viewport. let pages: Word.PageCollection = activePane.pagesEnclosingViewport; pages.load(); @@ -193,7 +194,7 @@ script: template: content: |-
- This sample demonstrates how to work with the pages, panes, and windows APIs. + This sample demonstrates how to work with pages, panes, and windows.

Set up

From 87e265037d2ba7f2834410c0fbaa01842c6a79ec Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Wed, 23 Apr 2025 11:42:47 -0700 Subject: [PATCH 4/6] Updates based on feedback --- playlists-prod/word.yaml | 2 +- playlists/word.yaml | 2 +- samples/word/35-ranges/get-pages.yaml | 126 ++++++++++++++------------ 3 files changed, 70 insertions(+), 60 deletions(-) diff --git a/playlists-prod/word.yaml b/playlists-prod/word.yaml index 8f717183..315c9303 100644 --- a/playlists-prod/word.yaml +++ b/playlists-prod/word.yaml @@ -340,7 +340,7 @@ - id: word-ranges-get-pages name: 'Work with pages, panes, and windows' fileName: get-pages.yaml - description: 'Shows how to work with pages, panes, and windows APIs.' + description: 'Shows how to work with pages, panes, and windows.' rawUrl: >- https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml group: Ranges diff --git a/playlists/word.yaml b/playlists/word.yaml index a64d92d3..be093b51 100644 --- a/playlists/word.yaml +++ b/playlists/word.yaml @@ -340,7 +340,7 @@ - id: word-ranges-get-pages name: 'Work with pages, panes, and windows' fileName: get-pages.yaml - description: 'Shows how to work with pages, panes, and windows APIs.' + description: 'Shows how to work with pages, panes, and windows.' rawUrl: >- https://raw.githubusercontent.com/OfficeDev/office-js-snippets/main/samples/word/35-ranges/get-pages.yaml group: Ranges diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml index f7e67ae2..8b303b27 100644 --- a/samples/word/35-ranges/get-pages.yaml +++ b/samples/word/35-ranges/get-pages.yaml @@ -21,19 +21,25 @@ script: pages.load(); await context.sync(); - console.log(pages); // Log info for pages included in selection. + console.log(pages); + const pagesIndexes = []; + const pagesText = []; for (let i = 0; i < pages.items.length; i++) { - let page = pages.items[i]; - page.load(); - await context.sync(); + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); - console.log(`Index info for page ${i + 1} in the selection: ${page.index}`); const range = page.getRange(); - range.load(); - await context.sync(); + range.load('text'); + pagesText.push(range); + } + + await context.sync(); - console.log("Text of that page in the selection:", range.text); + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index info for page ${i + 1} in the selection: ${pagesIndexes[i].index}`); + console.log("Text of that page in the selection:", pagesText[i].text); } }); } @@ -47,25 +53,29 @@ script: const paraThree = paragraphs.items[2]; const rangeOfParagraph = paraThree.getRange(); - await context.sync(); - const pages: Word.PageCollection = rangeOfParagraph.pages; pages.load(); await context.sync(); + // Log info for pages in range. console.log(pages); - // Log into for pages in range. + const pagesIndexes = []; + const pagesText = []; for (let i = 0; i < pages.items.length; i++) { - let page = pages.items[i]; - page.load(); - await context.sync(); + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); - console.log(`Index of page ${i + 1} that the third paragraph is found on: ${page.index}`); const range = page.getRange(); - range.load(); - await context.sync(); + range.load('text'); + pagesText.push(range); + } - console.log("Text of that page:", range.text); + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index of page ${i + 1} that contains the third paragraph: ${pagesIndexes[i].index}`); + console.log("Text of that page:", pagesText[i].text); } }); } @@ -77,30 +87,34 @@ script: // Get the active window. const activeWindow = context.document.activeWindow; activeWindow.load(); - await context.sync(); // Get the active pane. - let activePane = activeWindow.activePane; + const activePane = activeWindow.activePane; activePane.load(); - await context.sync(); - + // Get pages enclosing the viewport. - let pages: Word.PageCollection = activePane.pagesEnclosingViewport; + const pages: Word.PageCollection = activePane.pagesEnclosingViewport; pages.load(); + await context.sync(); // Log the number of pages. - let pageCount = pages.items.length; + const pageCount = pages.items.length; console.log(`Number of pages enclosing the viewport: ${pageCount}`); - // Log index info of these pages. - for (let i = 0; i < pages.items.length; i++) { - let page = pages.items[i]; - page.load(); - await context.sync(); - console.log(`Page index: ${page.index}`); + // Log index info of these pages. + const pagesIndexes = []; + for (let i = 0; i < pageCount; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); } + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + } }); } @@ -110,47 +124,43 @@ script: console.log("Getting first paragraph of each page..."); // Get the active window. - let activeWindow = context.document.activeWindow; + const activeWindow = context.document.activeWindow; activeWindow.load(); - await context.sync(); // Get the active pane. - let activePane = activeWindow.activePane; + const activePane = activeWindow.activePane; activePane.load(); - await context.sync(); // Get all pages. - let pages: Word.PageCollection = activePane.pages; + const pages: Word.PageCollection = activePane.pages; pages.load(); + await context.sync(); // Get page index and paragraphs of each page. + const pagesIndexes = []; + const pagesNumberOfParagraphs = []; + const pagesFirstParagraphText = []; for (let i = 0; i < pages.items.length; i++) { - // Get page index of the page. - let page = pages.items[i]; - page.load(); - await context.sync(); + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); - console.log(`Page index: ${page.index}`); - await context.sync(); + const paragraphs = page.getRange().paragraphs; + paragraphs.load('items/length'); + pagesNumberOfParagraphs.push(paragraphs); - // Get paragraphs of the page. - const range = page.getRange(); - range.load(); - let paragraphs: Word.ParagraphCollection = range.paragraphs; - paragraphs.load(); - await context.sync(); - - // Log the number of paragraphs on the page. - let paragraphsCount = paragraphs.items.length; - await context.sync(); - console.log(`Number of paragraphs: ${paragraphsCount}`); - // Log the first paragraph of the page. - let firstParagraph = paragraphs.items[0]; - firstParagraph.load(); - await context.sync(); - - console.log("First paragraph's text:", firstParagraph.text); + const firstParagraph = paragraphs.getFirst(); + firstParagraph.load('text'); + pagesFirstParagraphText.push(firstParagraph); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + console.log(`Number of paragraphs: ${pagesNumberOfParagraphs[i].items.length}`); + console.log("First paragraph's text:", pagesFirstParagraphText[i].text); } }); } From 92fd733396a11c8f4c15ebc37b842180f739520c Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Wed, 23 Apr 2025 14:54:16 -0700 Subject: [PATCH 5/6] remove jquery --- samples/word/35-ranges/get-pages.yaml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml index 8b303b27..b30e8b28 100644 --- a/samples/word/35-ranges/get-pages.yaml +++ b/samples/word/35-ranges/get-pages.yaml @@ -8,11 +8,11 @@ api_set: WordApiDesktop: '1.2' script: content: | - $("#get-pages-selected-range").on("click", () => tryCatch(getPagesOfSelectedRange)); - $("#get-pages-third-paragraph").on("click", () => tryCatch(getPagesOfThirdParagraph)); - $("#get-pages-enclosing-viewport").on("click", () => tryCatch(getPagesEnclosingViewport)); - $("#get-all-pages").on("click", () => tryCatch(getAllPages)); - $("#setup").on("click", () => tryCatch(setup)); + document.getElementById("get-pages-selected-range").addEventListener("click", () => tryCatch(getPagesOfSelectedRange)); + document.getElementById("get-pages-third-paragraph").addEventListener("click", () => tryCatch(getPagesOfThirdParagraph)); + document.getElementById("get-pages-enclosing-viewport").addEventListener("click", () => tryCatch(getPagesEnclosingViewport)); + document.getElementById("get-all-pages").addEventListener("click", () => tryCatch(getAllPages)); + document.getElementById("setup").addEventListener("click", () => tryCatch(setup)); async function getPagesOfSelectedRange() { await Word.run(async (context) => { @@ -243,13 +243,7 @@ style: language: css libraries: | https://appsforoffice.microsoft.com/lib/1/hosted/office.js - @types/office-js + https://appsforoffice.microsoft.com/lib/1/hosted/office.d.ts - office-ui-fabric-core@11.1.0/dist/css/fabric.min.css - office-ui-fabric-js@1.5.0/dist/css/fabric.components.min.css - - core-js@2.4.1/client/core.min.js - @types/core-js - - jquery@3.1.1 - @types/jquery@3.3.1 \ No newline at end of file + https://unpkg.com/office-ui-fabric-core@11.1.0/dist/css/fabric.min.css + https://unpkg.com/office-ui-fabric-js@1.5.0/dist/css/fabric.components.min.css \ No newline at end of file From 8f7a312f73beb6bab5b4b30cba85609dffef870f Mon Sep 17 00:00:00 2001 From: Elizabeth Samuel Date: Wed, 23 Apr 2025 15:38:19 -0700 Subject: [PATCH 6/6] map objects --- samples/word/35-ranges/get-pages.yaml | 8 +- snippet-extractor-metadata/word.xlsx | Bin 27526 -> 28077 bytes snippet-extractor-output/snippets.yaml | 420 +++++++++++++++++++++++++ 3 files changed, 424 insertions(+), 4 deletions(-) diff --git a/samples/word/35-ranges/get-pages.yaml b/samples/word/35-ranges/get-pages.yaml index b30e8b28..3533307d 100644 --- a/samples/word/35-ranges/get-pages.yaml +++ b/samples/word/35-ranges/get-pages.yaml @@ -85,11 +85,11 @@ script: // Gets the pages enclosing the viewport. // Get the active window. - const activeWindow = context.document.activeWindow; + const activeWindow: Word.Window = context.document.activeWindow; activeWindow.load(); // Get the active pane. - const activePane = activeWindow.activePane; + const activePane: Word.Pane = activeWindow.activePane; activePane.load(); // Get pages enclosing the viewport. @@ -124,11 +124,11 @@ script: console.log("Getting first paragraph of each page..."); // Get the active window. - const activeWindow = context.document.activeWindow; + const activeWindow: Word.Window = context.document.activeWindow; activeWindow.load(); // Get the active pane. - const activePane = activeWindow.activePane; + const activePane: Word.Pane = activeWindow.activePane; activePane.load(); // Get all pages. diff --git a/snippet-extractor-metadata/word.xlsx b/snippet-extractor-metadata/word.xlsx index 0867a4eb57643bd032635be3c3b3e2a946e57466..d614523682d32c83fb6646febcbced3a4eec439f 100644 GIT binary patch delta 20259 zcmX_nRajh2kZACM;1-+#26uwH!{DyLCAb9%IzVt|aF^h2!6gvf-QAtw!7u;bZ};WA zlysMLN%yIc1(?bem>LZv1iM|j{n`XwBofGm<1!njUrxgt#g%tD@9rn8JQR4&0*A8s zD&LCLUd%{Pj2%*-%G-UGgv7$7nwy02j=)3P#kugtZfm)mnM|;Gdkj`*UA)*y)Ir61 z@8QDBG-^BrUg!gzZZ_BZ?(SrKDHl3nawol<|LD;>jSkU4KG9HH+3Q3 zRIw0bYHQ7@=!PuBO3UO%YV9}50OeE26xih5nSp;`M>xB0D9O6Hx}JQe7TxS zGMfyPjrL}i?KU5_(~=ZOy;RIKbQ_juzr-D2PoLL(b%pH|ey%}_{45E(AXO4!5h&lO zrTxJ^OV(&N*8by;2lXL~?O%4#0=6q;z!hVnBIpgQ^-4Gbf%|hO^3xf%b-t%EZ z_1Dx`MQNm3f?0>>aA~EnFFhAqmJqFZdR@G{SyPgfcyLT&+k9i_fI;yvM+$-f&z?1_ z8N~cX zobrDcKSB$>n!kvZ=8%h4ZbY|UJQ$3nhcJA9?$Asj%q|Xd#jPE#9UmrQu`C$P9q~GO z!ZKbtq81f!qndMtZJR9IUs#6fjl2$BGKx=#> zvj4#f*?Wpjk830l;KnN37##4NQ1w+Zus{hJMp@R@*dDE^s0$`R6bZMU8Rau93hlnW z3oF-$56|HVHmE>|{eNyeu%W!{QS+QFNQ)_1LWf&9ZK!cVW=MPhi|?GdRP?*Z_uhac zH;X~DLT!+5|J>tVB!`vof{v4swtDLoK`s^iWj_u zV-dNC!kwJs7~*ei5NA;?vF%Fj1#u_LP*ky=)!!UB>mdk}-|;U;J+ul}vAVmTz(JoO zNeS;B9iu-gn$)~ZxEo+AJB%rn&ylwo(N<$=G!I<7LpSaV=*>`OO09hSyTjZ>S>aA2 z9=UqW=vEAq9$r2xAIj&x15SrGO&a=UEosepiMox2XFb331L2)d)3z_#COy3ie?hHq zKGISbjPwu%)`~+y{4Shi17m}>oA0#4fv;o;o@7YZea84wf5bSxj3U)9F%hn=$Mo2_ zH#N5@UW>T$(<5X%6-QW=pzwbj7~!2L5y@&seq=FrG^_}>D3>V-(ErUuLA~Z*mALF4 zbKi^ythYdm+cAqAIQ6Np5s|PsP+3T&kaK<{Y}$q(lTFsa%Yum>()FD79+z@m(wyny_!Yp{7iQv zbAbcNmKB1F9cQ1+CJaw00&_oN0FqCER?3*O>_irSCRNvEV}n~|8xC%ChKOMnZ9n%Vx_?KJ_C|?uhOVC{UZlT%`tafH?ZbbcM1!-KGhPRuq&{DN1^ug|SYu0nyPWfT z0z1S-qYUG(HQ;q&DANk4oG$$B+&<+<0-~2Jm)QIG5Zm?k`jj)V@%ntWkn{Fn^md&B zdA%}wx=ayyeQJU{tG?b|RExY`b*;RvY`ngRyj?szkwczd$ltMc_BO6!jUcc3!LKsi z$zAWbZ`DRk3ugy8ueT=?A}^IjFXioz`PIH<0=K`4+wWeBSp9|~!A4KX3s(@gv*PW= zJp+{Q+BH1_*EL;bIRAz{o#*{eh(Dv7yZ9^#2W`ljrY{i|7p~okzxo+D6ET& z3NWOu^mG!xp?{q2vZJ~gV{0Pa+azwdpaMNncQhoi0^Pw8@r)NHqGI$l?nlaIG=!CH6_B@zNm>7-Xw%=kdkh)v5iAgq3hsa>bOo(!Iw2{T&pR%FL&D zL$zt#H%=mn%CEx)hlKIb3<-Jv_BB~^p|t~E&~7s=5B__juQQxs6_Kqe^p5a3Yu31Pz=GP!F{ zxiwU+)YU3QpbV$H2Fg5`yJ4QNvA*Hf)`_j#>KXv-ENRhUz*xAdK(nJRoP#%Kk=De# z+z?}!#T|&gKO#cn*G~ysN&6fpyYT|mA!BQ9o^S*B6g+5xZkR`C&MH^LSBTmGr5CQ0 zAKsmOP%>W1T}yov9{5Bf=Ig55DV}C=r$n?j;;6U```|T9OlPN2$JS`DQJG!)x>11N z4=k7Z${J$WVGMz96}eNyUnqEA#28Sj?@{$8{!yXQYW{_s%7b#>Gv2R2NgfzN{~fWN z`$h5svGLSYO4QfRY{cARA`SZx~z3K64?Z7&eiix4J zh7MLd6ffMXMIgg$UQc0?rt$(d^meap$tskp0`d-L_zzAo99IE3KtE|4O?fjQ_whho z0@oA(Mr<~Z{H36>MPq(i68GON=yh7;jA~3R7xjlmR{k6nd<$~m`a5a_8~Eu9yXn03 zCq~1Pu1A``3-zT7hLjDA)u3bmU`_KO^^?FDGtJ^tWpbaarHJvjrL_A!0F3SC(Gx@p zHUzz#-KGAAlP9{HPHe?y4fnCnZ@z~1#)i&*{Ke5nE8pXnDsK6LFnQxVNy!7o#yiLik~ma8?E9D~GdS%>{Kv|t4N zmgri;(Gv6R9MK%-9vg|g%)vh4ud@Z=`R3z z1iEkc?{$eN>y|u0<6l4y!Li7Y%hrIfPXxMXP@)CcTlT{sQMLu`T+mRRsOeVE8_^HT8FbGhk5+$a3DR85H$}Hk|Wo*a}rr2#P; zZ4*8yyOboxKE`OS*WV|7WPH~&)~ObSj7y^<{p+KZ+jZL-ZNB1#`>AG%NM`#DS)MMM zps&2w!?;%vVd>e}KL6vl=~zh4BTZ-Z39ARw#;GA!;N^VZ9bmy`vvk2ral$KF!&;ep zYbuATqkm=EQm^~oEyHeceI>@J!k4;UQ_PgK?@>|fQ8+hNNbG*4f93AeVKC-yRsI>4 z!`$zg`%3K(l^a1sc^kBccf^iVej~IOtV(i@v2mq{*#bv41xQgZME` zSg}~UT}OcMW$k1fMytsl57=AkRn~{OgC~hEJG1nsvZ4CfUOi)=n6vrew{AZNk( zsX4Y$p1(^(xH9P0gW~OVzCDh&2c?@DB$AZrNhRmci#r2nkoIlKk9%XmV zT6iaJ>KnOnOvM6{-pye2ajDei@M`3IMfKBX(Av%3SQ@GzrN)0^qLr#~IeXriV4Rec z6DwHWj-em#gY3b$z+G{^b(rjT@1ytc(7!>lA(x~fzVyR|4R;Y2T}xxEVW6YTK( zuL+da0k6a3Ig6|L*|jQLtdOhL9u+`XbCK0(8#vELlQ`v|m&>i`og}Dzn}MiG`aL2m zvg7eO>)A(rQTJ%8l3MIPk$Vjd*vvIWh~}4d(}kS2*+x2TJUYZntIljL0G_Nit$6}Z zsVoFuO5gWj?QYsq+bR&g$8)9^kVrDQxwB)H4b}gwN*y$A_e z@e3F3Y&vr%Ob>v5X8j&nlZ=?%DOSMUMn~mz`s-bDj&bJNr+(2FueP&3hOY3BXwn3u z8RqDVImaVI4qDtPXLePFjcX{KV#(6ZkYvLRO4Rqf>KJE-A8694N2GH63hc|gB<`J+ zdv(G_cf{hJ`K`_qe|4H+P+XoYjh4h@xD?H`@v=}7(#n^Sv_U!gUsk59Um|x8)L@QY zr_n9%X?l+}Un8FIP59pPD2^_A^Mfw4fy4QBh2urizoOGupWD|-@4DvOzsnGpAV5cD zg+3PMr6DtW_hqf=4||`ZBHHx?Y8Gc$quag>E)k9zE$Uma2?n}P{5sh4$@~$b8A35T9>+;s3oPOT3^Gv5y+U6W{pvvws*mf?{ zkYG=z@X#_olbL|=1cCmK9Q=^d^AN?MJ%{7M){h+;A62*O{F1PsH^MaFM-H#jbA0g0 zPbwAzsvm(55`GjK|H|xb*NnfVFHhUf`Icm5TKu z4(QO;JFb{(JH<`n^_R><3{8-fG7iE1Fn8JBEaBehMJ%CHeZ|RY-5V10_HNtC(vic& zR=c626z-U4m5s9&916~hol&I@J9nE4r&ZY%f9tx|C~y1Gwej(ZSb%crX19P%qbspg zaRZu@oPl)lsKr;%Q&${@tH&p!8zdWg)eHR2AZG)Avmt*i?~PDaHh&4FN-J-l1< z0ug(gR|q`LheO_4DN%RKEEL1v4>Qj{U9prOI$<&fG;5)z#177_fR%qby6Tj`?R0ar zUM?vH<8Mm7y+YU5+*5v%yfSbTyht!-PFEd)(vFH#$gYZzYFSSz-5`6PiVAwH_rqF= zB6d`6BhilE_QjILdq+3O)2E_94PfDnw%P3-5mq)|w%qQPB%;~BNMDEdtWm}3?l zDUZlzGrPm#WoE%6eqHN&>>VbJezPhzT43I$S}_|)QVl#hS#p4VoL}f0hu<*@%CciM z^UAN*=ZD;uvP!rY7+O9{ZX_Ga@^mrq;rz#1mB{P2>W$lWncUZ~&;1?nmJjT!+HN_E zer~5iY_V>UsU4DlQLQNnqxdb%SS)jGhUFj2z2Q$W@^Z;&lJ*+Gc&_%Y;l8LgPgCW#U|y3hJL30h10q#B>1r zBkGDz8>V5!bIa2|^ArqdUrSe{Aj`tj)zOJnmao=~`jy9EoHz5)1kFpj z*RAzzcsWuuH>4$I&s7@*R{4R7q)IKwUO_knI>G)HC&B)fh^K665sCLssaIL{P6<+% z2M#(vgE~eNj2*QkD%-m--SimsDkH&vR7zPszd6ZcTr2MbI*N#@$$K-hNNUD9G?ZH^XsDZWMw)*VKXL*2b8~th-lkng1UQ0|U#mra;oD=z?C8Xi75}wHZT7SKS zP;4eJi*98fPR;jPnGQW6TASAk1Zt>yt0&c5KFhW_cp>b+r4is< zkbkong@B?#0h1?w5Zkv7PVthSyG9Muj67)4!(+Ru2d`~+sfRe zA;VXcWClk^_`ZDqo7nl&emcxYnS7^QjqQF#a8Q}Eqx@boA;Z!PVIlJ@r$H7+c%##+ zbwlVok0yjv47ck@dy0njB@{2^&oBS6NQ_^VeGHCCmx64uRj&lDum)*~r=WN^!vE?b zw9#Mg86uU^2kQ65@!k{TA@v}{#z0jUHw0ra8TLEkUDnK_fOPl>1u@N6A{8gTuOy@x z&)hLcN8fp6!iyGo}<8Kl&ucfv;Kp=1|ZwXcj$%S+!NE?rd27gYhF zd^#p$wwiLVKqUr;xs7(O2ln!kFbQE6$rhY@ z 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 VM&k8TgCu&A?EOT}l>7XL`5$ujG5Y`j delta 19693 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

% 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 F^B+AwvPl2{ diff --git a/snippet-extractor-output/snippets.yaml b/snippet-extractor-output/snippets.yaml index 504cc0a9..1f615506 100644 --- a/snippet-extractor-output/snippets.yaml +++ b/snippet-extractor-output/snippets.yaml @@ -20925,6 +20925,56 @@ context.document.save(); await context.sync(); }); +'Word.Document#activeWindow:member': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the first paragraph of each page. + console.log("Getting first paragraph of each page..."); + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get all pages. + const pages: Word.PageCollection = activePane.pages; + pages.load(); + + await context.sync(); + + // Get page index and paragraphs of each page. + const pagesIndexes = []; + const pagesNumberOfParagraphs = []; + const pagesFirstParagraphText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const paragraphs = page.getRange().paragraphs; + paragraphs.load('items/length'); + pagesNumberOfParagraphs.push(paragraphs); + + const firstParagraph = paragraphs.getFirst(); + firstParagraph.load('text'); + pagesFirstParagraphText.push(firstParagraph); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + console.log(`Number of paragraphs: ${pagesNumberOfParagraphs[i].items.length}`); + console.log("First paragraph's text:", pagesFirstParagraphText[i].text); + } + }); 'Word.Document#changeTrackingMode:member': - >- // Link to full sample: @@ -22846,6 +22896,285 @@ await context.sync(); console.log("Styles imported from JSON:", styles); }); +'Word.Page:class': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets pages of the selection. + const pages: Word.PageCollection = context.document.getSelection().pages; + pages.load(); + await context.sync(); + + // Log info for pages included in selection. + console.log(pages); + const pagesIndexes = []; + const pagesText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const range = page.getRange(); + range.load('text'); + pagesText.push(range); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index info for page ${i + 1} in the selection: ${pagesIndexes[i].index}`); + console.log("Text of that page in the selection:", pagesText[i].text); + } + }); +'Word.Page#getRange:member(1)': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets pages of the selection. + const pages: Word.PageCollection = context.document.getSelection().pages; + pages.load(); + await context.sync(); + + // Log info for pages included in selection. + console.log(pages); + const pagesIndexes = []; + const pagesText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const range = page.getRange(); + range.load('text'); + pagesText.push(range); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index info for page ${i + 1} in the selection: ${pagesIndexes[i].index}`); + console.log("Text of that page in the selection:", pagesText[i].text); + } + }); +'Word.Page#index:member': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the pages that contain the third paragraph. + const paragraphs: Word.ParagraphCollection = context.document.body.paragraphs; + paragraphs.load(); + await context.sync(); + + const paraThree = paragraphs.items[2]; + const rangeOfParagraph = paraThree.getRange(); + const pages: Word.PageCollection = rangeOfParagraph.pages; + pages.load(); + await context.sync(); + + // Log info for pages in range. + console.log(pages); + const pagesIndexes = []; + const pagesText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const range = page.getRange(); + range.load('text'); + pagesText.push(range); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index of page ${i + 1} that contains the third paragraph: ${pagesIndexes[i].index}`); + console.log("Text of that page:", pagesText[i].text); + } + }); +'Word.PageCollection:class': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets pages of the selection. + const pages: Word.PageCollection = context.document.getSelection().pages; + pages.load(); + await context.sync(); + + // Log info for pages included in selection. + console.log(pages); + const pagesIndexes = []; + const pagesText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const range = page.getRange(); + range.load('text'); + pagesText.push(range); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Index info for page ${i + 1} in the selection: ${pagesIndexes[i].index}`); + console.log("Text of that page in the selection:", pagesText[i].text); + } + }); +'Word.Pane:class': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the first paragraph of each page. + console.log("Getting first paragraph of each page..."); + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get all pages. + const pages: Word.PageCollection = activePane.pages; + pages.load(); + + await context.sync(); + + // Get page index and paragraphs of each page. + const pagesIndexes = []; + const pagesNumberOfParagraphs = []; + const pagesFirstParagraphText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const paragraphs = page.getRange().paragraphs; + paragraphs.load('items/length'); + pagesNumberOfParagraphs.push(paragraphs); + + const firstParagraph = paragraphs.getFirst(); + firstParagraph.load('text'); + pagesFirstParagraphText.push(firstParagraph); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + console.log(`Number of paragraphs: ${pagesNumberOfParagraphs[i].items.length}`); + console.log("First paragraph's text:", pagesFirstParagraphText[i].text); + } + }); +'Word.Pane#pages:member': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the first paragraph of each page. + console.log("Getting first paragraph of each page..."); + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get all pages. + const pages: Word.PageCollection = activePane.pages; + pages.load(); + + await context.sync(); + + // Get page index and paragraphs of each page. + const pagesIndexes = []; + const pagesNumberOfParagraphs = []; + const pagesFirstParagraphText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const paragraphs = page.getRange().paragraphs; + paragraphs.load('items/length'); + pagesNumberOfParagraphs.push(paragraphs); + + const firstParagraph = paragraphs.getFirst(); + firstParagraph.load('text'); + pagesFirstParagraphText.push(firstParagraph); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + console.log(`Number of paragraphs: ${pagesNumberOfParagraphs[i].items.length}`); + console.log("First paragraph's text:", pagesFirstParagraphText[i].text); + } + }); +'Word.Pane#pagesEnclosingViewport:member': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the pages enclosing the viewport. + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get pages enclosing the viewport. + const pages: Word.PageCollection = activePane.pagesEnclosingViewport; + pages.load(); + + await context.sync(); + + // Log the number of pages. + const pageCount = pages.items.length; + console.log(`Number of pages enclosing the viewport: ${pageCount}`); + + // Log index info of these pages. + const pagesIndexes = []; + for (let i = 0; i < pageCount; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + } + }); 'Word.Paragraph:class': - >- // Link to full sample: @@ -25344,3 +25673,94 @@ console.log(`Details about the alignment of the first table's first row:`, `- Horizontal alignment of every cell in the row: ${firstTableRow.horizontalAlignment}`, `- Vertical alignment of every cell in the row: ${firstTableRow.verticalAlignment}`); }); +'Word.Window:class': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the first paragraph of each page. + console.log("Getting first paragraph of each page..."); + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get all pages. + const pages: Word.PageCollection = activePane.pages; + pages.load(); + + await context.sync(); + + // Get page index and paragraphs of each page. + const pagesIndexes = []; + const pagesNumberOfParagraphs = []; + const pagesFirstParagraphText = []; + for (let i = 0; i < pages.items.length; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + + const paragraphs = page.getRange().paragraphs; + paragraphs.load('items/length'); + pagesNumberOfParagraphs.push(paragraphs); + + const firstParagraph = paragraphs.getFirst(); + firstParagraph.load('text'); + pagesFirstParagraphText.push(firstParagraph); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + console.log(`Number of paragraphs: ${pagesNumberOfParagraphs[i].items.length}`); + console.log("First paragraph's text:", pagesFirstParagraphText[i].text); + } + }); +'Word.Window#activePane:member': + - >- + // Link to full sample: + https://raw.githubusercontent.com/OfficeDev/office-js-snippets/prod/samples/word/35-ranges/get-pages.yaml + + + await Word.run(async (context) => { + // Gets the pages enclosing the viewport. + + // Get the active window. + const activeWindow: Word.Window = context.document.activeWindow; + activeWindow.load(); + + // Get the active pane. + const activePane: Word.Pane = activeWindow.activePane; + activePane.load(); + + // Get pages enclosing the viewport. + const pages: Word.PageCollection = activePane.pagesEnclosingViewport; + pages.load(); + + await context.sync(); + + // Log the number of pages. + const pageCount = pages.items.length; + console.log(`Number of pages enclosing the viewport: ${pageCount}`); + + // Log index info of these pages. + const pagesIndexes = []; + for (let i = 0; i < pageCount; i++) { + const page = pages.items[i]; + page.load('index'); + pagesIndexes.push(page); + } + + await context.sync(); + + for (let i = 0; i < pagesIndexes.length; i++) { + console.log(`Page index: ${pagesIndexes[i].index}`); + } + });