プレゼンテーションの単語を置き換えるONLYOFFICEマクロ

プレゼンテーションの作成中に、特定の単語の出現回数をすべて変更する必要がある場合がいくつかあります。特にスライドがたくさんある場合、手作業での修正は時間がかかります。このプロセスを簡単にするために、プレゼンテーションエディタで特定の単語を置き換えるマクロを作成しましょう。

<img class="aligncenter wp-image-75835" src="https://static-blog.onlyoffice.com/wp-content/uploads/2023/11/15122245/new-macro-replace-words-in-slides.png" alt="An ONLYOFFICE Macro that replaces a word in the Presentation Editor" width="736" height="372" />

<!--more-->
<h2><strong>マクロの構築</strong></h2>
<pre class="theme:github font:monospace lang:js decode:true ">const oPresentation = Api.GetPresentation(); //get the current presentation
</pre>
まず、oPresentation変数で現在のプレゼンテーションを取得します。
<pre class="theme:github font:monospace lang:js decode:true ">for (
    var slideIndex = 0;
    slideIndex &lt; oPresentation.GetSlidesCount();
    slideIndex++
  ) {
</pre>
このマクロはネストされたforループを含みます。この最初のforループでは、プレゼンテーションのすべてのスライドを繰り返し処理します。
<pre class="theme:github font:monospace lang:js decode:true ">var oSlide = oPresentation.GetSlideByIndex(slideIndex);
var aShape = oSlide.GetAllShapes(); //get all the shapes from different slides
</pre>
これらの行は、特定のスライドに存在する可能性のあるすべての図形を取得し、その詳細を aShape 配列にプッシュします。
<pre class="theme:github font:monospace lang:js decode:true ">for (var shapeIndex = 0; shapeIndex &lt; aShape.length; shapeIndex++) {
      var content = aShape[shapeIndex].GetDocContent();
</pre>
この2番目のforループでは、特定のスプレッドシート上の各図形の内容を取得します。
<pre class="theme:github font:monospace lang:js decode:true ">if (content) {
        var count = content.GetElementsCount();
        for (var elementIndex = 0; elementIndex &lt; count; elementIndex++) {
          var element = content.GetElement(elementIndex);
</pre>
content変数が存在することを確認し、contentに存在するすべての要素のカウントを取得します。
<pre class="theme:github font:monospace lang:js decode:true ">if (element) {
            const rawText = element.GetText(); //gets the text from a particular element
            element.Delete(); //delete the content
            const wordToFind = "apple"; // Replace "apple" with the word you want to find
            const replacementWord = "banana"; // Replace "banana" with the word you want to replace it with
            const cleanedText = rawText.replace(
              new RegExp(wordToFind, "g"),
              replacementWord
            );
</pre>
まず、変数要素が有効かどうかを確認します。要素が存在すれば、元のテキストをコピーし、element.delete()メソッドで内容を削除します。

続いて、置換する単語と置換後の単語をそれぞれの変数に指定し、置換を実行して新しいテキストをcleanedText変数に格納します。
<pre class="theme:github font:monospace lang:js decode:true "> var oParagraph = Api.CreateParagraph();
 var oRun = Api.CreateRun();
 oRun.AddText(cleanedText);
 oParagraph.AddElement(oRun);
 content.Push(oParagraph);
</pre>
最後に、新しい段落を作成し、そこにcleanedTextを追加します。段落要素のセットアップが完了したら、上記のコードを使用して、上記で削除した段落要素の代わりにスライドに追加します。
<h2>マクロの全コード</h2>
マクロのコード全体は下記のようになります：
<pre class="theme:github font:monospace lang:js decode:true">(function () {
  const oPresentation = Api.GetPresentation(); //get the current presentation
  for (
    var slideIndex = 0;
    slideIndex &lt; oPresentation.GetSlidesCount();
    slideIndex++
  ) {
    var oSlide = oPresentation.GetSlideByIndex(slideIndex);
    var aShape = oSlide.GetAllShapes(); //get all the shapes from different slides

    for (var shapeIndex = 0; shapeIndex &lt; aShape.length; shapeIndex++) {
      var content = aShape[shapeIndex].GetDocContent();

      // Check if content exists before proceeding
      if (content) {
        var count = content.GetElementsCount();
        for (var elementIndex = 0; elementIndex &lt; count; elementIndex++) {
          var element = content.GetElement(elementIndex);

          // Check if element is valid before using it
          if (element) {
            const rawText = element.GetText(); //gets the text from a particular element

            element.Delete(); //delete the content

            const wordToFind = "apple"; // Replace "apple" with the word you want to find
            const replacementWord = "banana"; // Replace "banana" with the word you want to replace it with
            const cleanedText = rawText.replace(
              new RegExp(wordToFind, "g"),
              replacementWord
            );

            //creates a new paragragh, and restores the content which was deleted, with the cleaned text.
            var oParagraph = Api.CreateParagraph();
            var oRun = Api.CreateRun();
            oRun.AddText(cleanedText);
            oParagraph.AddElement(oRun);
            content.Push(oParagraph);
          }
        }
      }
    }
  }
})();
</pre>
マクロを実行して結果を見ましょう！
<div style="text-align: center;"><iframe width="560" height="315" src="https://www.youtube.com/embed/St-oPElEzIE?si=C8361Ba78Nhpg9qk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen"></iframe></div>
このマクロが皆さまのお役に立ち、プレゼンテーションのワークフローを効率化できたなら幸いです。

ONLYOFFICE APIのパワーを活用するチャンスをお見逃しなく。私たちのAPIメソッドの豊富なライブラリは、あなたのアイデアを現実に変える鍵です。ご質問や革新的なコンセプトがあれば、ぜひ私たちと<a href="https://www.onlyoffice.com/ja/contacts.aspx?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=replace_word_presentation_macro" target="_blank" rel="noopener">共有してください</a>。
<div class="useful-links">
<h3>お役立ちリンク</h3>
<a href="https://api.onlyoffice.com/plugin/macrosamples/?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=replace_word_presentation_macro" target="_blank" rel="noopener"><u>マクロのサンプル</u></a>

<a href="https://www.onlyoffice.com/blog/ja/2023/11/replace-words-in-the-document-with-onlyoffice-macro?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=replace_word_presentation_macro" target="_blank" rel="noopener"><u>文書エディタ用単語置換マクロ</u></a>

<a href="https://github.com/ONLYOFFICE" target="_blank" rel="noopener"><u>ONLYOFFICE on GitHub</u></a>

<a href="https://api.onlyoffice.com/docbuilder/presentationapi?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=replace_word_presentation_macro" target="_blank" rel="noopener"><u>ONLYOFFICE Presentation API</u></a>

<a href="https://www.onlyoffice.com/ja/presentation-editor.aspx?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=replace_word_presentation_macro" target="_blank" rel="noopener">無料のオンライン・プレゼンテーション・エディタ</a>

</div>