ONLYOFFICEマクロでスプレッドシートをコピーする方法

スプレッドシートの編集は、特に同じようなデータを持つ複数のスプレッドシートを扱う場合、厄介な場合があります。そこで、あるスプレッドシートから別のスプレッドシートにデータをコピーし、大きなスプレッドシートを簡単に扱えるようにするマクロを作成しましょう。

<img class="aligncenter wp-image-75342" src="https://static-blog.onlyoffice.com/wp-content/uploads/2023/11/09121908/copy.png" alt="Use ONLYOFFICE macro to copy spreadsheets" width="736" height="372" />

<!--more-->
<h2><strong>マクロの構築</strong></h2>
まず、エディタで現在のシートにアクセスします。次に、コピー先のシートにpastesheet変数でアクセスし、oRange変数で作業範囲を指定します。
<pre class="theme:github font:monospace lang:js decode:true ">  const oWorksheet = Api.GetActiveSheet();
  const pastesheet = Api.GetSheet("Sheet2");
  const oRange = oWorksheet.GetRange("A1:C10");
  // If you want to copy a specific Selection to the new sheet
  // var oRange = oWorksheet.GetSelection();
</pre>
<strong>ご注意</strong>：選択範囲を処理したい場合は、上の行のコメントを外して GetSelection() メソッドを使用してください。

次に、指定した範囲に対して ForEach メソッドを使用して、範囲内の各セルを繰り返し処理します。
<pre class="theme:github font:monospace lang:js decode:true ">oRange.ForEach(function (range) {
</pre>
コールバック関数のパラメータ範囲を使って、各セルのデータにアクセスします。
<pre class="theme:github font:monospace lang:js decode:true ">  const oValue = range.GetValue();
  const oCharacters = range.GetCharacters(0, 2);
  const oFont = oCharacters.GetFont();
  const fontName = oFont.GetName();
  const oSize = oFont.GetSize();
  const isBold = oFont.GetBold();
  const isItalic = oFont.GetItalic();
</pre>
ForEachメソッドでは、まずセルの値を抽出します。次に、太字や斜体などのパラメータを知るために、値の初期文字を抽出します。そして、新しいシートに実装するために、fontNameとフォントサイズを取得します。
<pre class="theme:github font:monospace lang:js decode:true ">if (oValue === null || oValue === "") {
      pastesheet.GetRange(range).SetValue(" ");
    }
</pre>
新しいシートに値を入れる前に、上図のようにif elseループを使っていくつかのチェックを行い、空のセルが新しいシートで正しく表現されていることを確認します。
<pre class="theme:github font:monospace lang:js decode:true ">else {
      oFont.SetName(fontName);
      pastesheet.GetRange(range).SetValue(oValue);
      pastesheet.GetRange(range).SetFontName(fontName);
      pastesheet.GetRange(range).SetFontSize(oSize);
      oWorksheet.GetRange(range).AutoFit(false, true);
      if (isBold) {
        pastesheet.GetRange(range).SetBold(true);
      }
      if (isItalic) {
        pastesheet.GetRange(range).SetItalic(true);
      }
    }
</pre>
最後にelseループで、対応するセルに値を入れ、そのセルに太字、斜体、フォント名、フォントサイズなどのプロパティを与えます。
<h2>マクロ全体</h2>
マクロ全体のコードは次のとおりです：
<pre class="theme:github font:monospace lang:js decode:true">(function () {
  const oWorksheet = Api.GetActiveSheet();
  const pastesheet = Api.GetSheet("Sheet2");
  const oRange = oWorksheet.GetRange("A1:C10");

  // If you want to copy a specific Selection to the new sheet
  // var oRange = oWorksheet.GetSelection();

  oRange.ForEach(function (range) {
    const oValue = range.GetValue();
    const oCharacters = range.GetCharacters(0, 2);
    const oFont = oCharacters.GetFont();
    const fontName = oFont.GetName();
    const oSize = oFont.GetSize();
    const isBold = oFont.GetBold();
    const isItalic = oFont.GetItalic();
    if (oValue === null || oValue === "") {
      pastesheet.GetRange(range).SetValue(" ");
    } else {
      oFont.SetName(fontName);
      pastesheet.GetRange(range).SetValue(oValue);
      pastesheet.GetRange(range).SetFontName(fontName);
      pastesheet.GetRange(range).SetFontSize(oSize);
      oWorksheet.GetRange(range).AutoFit(false, true);

      if (isBold) {
        pastesheet.GetRange(range).SetBold(true);
      }
      if (isItalic) {
        pastesheet.GetRange(range).SetItalic(true);
      }
    }
  });
})();
</pre>
覚えておくべきポイントがあります。
<ul>
 	<li>マクロで指定するシート名が存在することを確認してください。</li>
 	<li>マクロは、新しく作成したシートではなく、必ずメインシート（親シート）から実行してください。</li>
</ul>
マクロを実行して、その動作を確認してみましょう！
<div style="text-align: center;"><iframe width="560" height="315" src="https://www.youtube.com/embed/BUoFeH4Fb_I?si=KMnNmF1CEIrJSvko" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" data-mce-fragment="1"></iframe></div>
GetSelection() メソッドを使用したマクロの例をもうひとつ示します：
<div style="text-align: center;"><iframe width="560" height="315" src="https://www.youtube.com/embed/z9qfoBgNWLM?si=TjdXB-xcQafTP9wa" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" data-mce-fragment="1"></iframe></div>
マクロが皆さまの日々のスプレッドシート編集作業において素晴らしいツールとなることを願っています！

ONLYOFFICE APIのパワーを活用するチャンスをお見逃しなく。私たちのAPIメソッドの豊富なライブラリは、皆さまのアイデアを現実に変える鍵です。ご質問や革新的なコンセプトがありましたら、ぜひ私たちと共有してください。

<h3>お役立ちリンク</h3>
<a href="https://api.onlyoffice.com/plugin/macrosamples/?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=copy_spreadsheet_macro" target="_blank" rel="noopener">マクロのサンプル</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=copy_spreadsheet_macro" target="_blank" rel="noopener"><u>文書エディタ用置換マクロ</u></a>

<a href="https://github.com/ONLYOFFICE" target="_blank" rel="noopener">ONLYOFFICEのGitHubページ</a>

<a href="https://www.youtube.com/playlist?list=PLCF48HEKMOYNBygGjr9lSw3PLpVXQ6s_t" target="_blank" rel="noopener">ONLYOFFICE ドキュメントのマクロ【無料講座】</a>

<a href="https://api.onlyoffice.com/docbuilder/spreadsheetapi?utm_source=blog&amp;utm_medium=article+&amp;utm_id=copy_spreadsheet_macro" target="_blank" rel="noopener">ONLYOFFICE Spreadsheet API</a>

<a href="https://www.onlyoffice.com/blog/ja/search?s=マクロ&amp;utm_source=qiita&amp;utm_medium=article+&amp;utm_id=copy_spreadsheet_macro" target="_blank" rel="noopener">他のマクロ</a>