11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Office Scripts と Power Automateで申込書を自動でPDF化する方法

Last updated at Posted at 2025-08-27

本記事では、Microsoft 365の一部であるOffice ScriptsとPower Automateを活用して、Formsで入力された申込情報を自動的にPDF化し、SharePointに保存するシステムの構築方法を解説します。

目次

1. Office Scriptsとは?
2. システムの概要
3. 事前準備
4. Office Scriptsの構築
5. Power Automateフローの全体像
6. Power Automateフローの各種設定
7. 動作確認
8. まとめ

1.Office Scriptsとは?

Office ScriptsはExcel Onlineでの作業を自動化し、作業効率を向上させるための便利なツールです。たとえば、データを特定の形式で整理したい場合や、定期的にレポートを生成したい場合、Office Scriptsを使うことで、手動で行うことなく自動で処理を実行できます。
似たようなツールにVBAがありますが、VBAはデスクトップ版のExcelで動作するのに対し 、Office Scriptsはクラウド版のExcelで操作する点が大きな違いです。

2.システムの概要

今回、Formsで記入した申込内容を元に申込書をPDFで出力し、SharePointに格納するシステムをPower Automateで構築しました。システム全体の流れは下図の通りです。

システム構成図.png

▼Forms
ユーザーが記入するための入力フォームです。

▼SharePoint
申込書の雛形(Excelファイル)の格納先という役割とPower AutomateでPDF変換したファイルの格納先の役割を持っています。

▼OneDrive
Power Automateでは、SharePoint上でPDF変換する処理ができないため、OneDrive上でPDF変換を行います。また、申込書の雛形を編集する場所の役割を持っています。

▼Office Scripts
Formsで入力した値を、申込書の雛形をコピーしたExcelに書き込む役割を持っています。

▼Power Automate
SharePoint、OneDrive、Office Scriptsと連携して図の処理を実行する役割を持っています。また、Formsでの回答保存をトリガーに起動させます。

3.事前準備

Power AutomateとOffice ScriptsはMicrosoft 365のライセンスを所持していれば利用できます。 システム構築前に必要な準備について下記に記載します。

▼Forms
申込の入力フォームをFormsで作成します。例として、今回は下図のような内容で作成しました。
1Forms1.PNG
2Forms2.PNG

▼Excel(申込書雛形)
申込書の雛形を作成します。レイアウトは自由で構いませんが、項目はFormsと揃えてください。
5雛形エクセル.PNG

▼SharePointライブラリ
申込書の雛形を格納するためのライブラリとPDF変換したファイルを格納するためのライブラリの2つを用意します。
列やライブラリの設定は不要です。

申込書の雛形格納用ライブラリ
3雛形格納用ライブラリ.PNG

PDF格納用ライブラリ
4PDF用ライブラリ.PNG

4.Office Scriptsの構築

Office Scriptsの構築手順を下記に記載します。

4-1.下記URLよりOneDriveにアクセスし、Power Automateを構築予定のアカウントと同じアカウントでサインインします。
https://www.microsoft365.com/onedrive/

4-2. OneDriveのホーム画面から任意のExcelファイルをブラウザで開きます。(開くExcelファイルはなんでも良いです。)

4-3.[自動化]タブを選択します。
6自動化タブ.PNG

4-4.[新しいスクリプト]を選択します。
7新しいスクリプト.PNG

4-5.下記画像の赤枠をクリックし、スクリプトの名前を変更します。
8名前変更.PNG

4-6.スクリプトの入力欄に下記コードを入力します。

function main(
    workbook: ExcelScript.Workbook,
    aName: string,
    aFurigana: string,
    aEmail: string,
    bServiceName: string,
    bDesiredDay: string,
    bSalesPerson: string,
    cRemarks: string) {
    let applicationSheet = workbook.getWorksheet("申込用紙");
    if (applicationSheet != void 0) {

        // お名前
        range = applicationSheet.getRange("C15");
        range.setValue(aName);

        // ふりがな
        range = applicationSheet.getRange("C16");
        range.setValue(aFurigana);

        // メールアドレス
        range = applicationSheet.getRange("C17");
        range.setValue(aEmail);

        // サービス名
        range = applicationSheet.getRange("C20");
        range.setValue(bServiceName);

        // 希望日付
        range = applicationSheet.getRange("C21");
        range.setValue("'" + bDesiredDay.substring(0, 4) + "/" + bDesiredDay.substring(5, 7) + "/" + bDesiredDay.substring(8));

        // 受付担当者
        range = applicationSheet.getRange("C22");
        range.setValue(bSalesPerson);

        // 備考欄
        range = applicationSheet.getRange("B25");
        range.setValue(cRemarks);
    }
}

このスクリプトは、Excelの「申込用紙」というワークシートに、 Formsで入力された情報を自動で書き込むため の関数 main を定義しています。いくつかコードの解説を記載します。

・引数の設定
3~9行目の「aName: string,」といった形で記載されている部分はFormsに記載した値を受け取るために設定しています。例えば、「aName」の部分はユーザーの名前を格納するための引数で雛形に記載する値に応じて適宜設定します。また、「string」の部分はデータの型を指定する箇所あり、今回の場合は文字列型として指定しています。

・ワークシートの取得

let applicationSheet = workbook.getWorksheet("申込用紙");

10行目に記載の上記のコードはExcelワークブックの中から「申込用紙」という名前のシートを取得し、その情報を applicationSheet という変数に格納します。

・シートの存在確認

if (applicationSheet != void 0) {

11行目に記載の上記のコードは取得した applicationSheet が存在するかを確認し、存在しない場合は処理をスキップします。

・情報の入力処理
各引数の値をシート内の特定のセルに設定します。以下はその具体的な処理です。

// お名前
range = applicationSheet.getRange("C15");
range.setValue(aName);

14~15行目に記載の上記のコードは引数 aName をシートのセル C15 に入力する部分です。お名前が指定された位置にセットされます。
同様に、ふりがな (C16)、メールアドレス (C17)、サービス名 (C20)、希望日 (C21)、受付担当者 (C22)、備考 (B25) についても設定します。

・希望日の日付フォーマット

range.setValue("'" + bDesiredDay.substring(0, 4) + "/" + bDesiredDay.substring(5, 7) + "/" + bDesiredDay.substring(8));

31行目の上記のコードは希望日の日付を YYYY/MM/DD 形式に整形して、指定されたセルに入力しています。日付文字列を分割して並べ替えることで、正しいフォーマットに変換しています。

4-7.[スクリプトを保存]をクリックします。
4-8.[実行]をクリックします。
4-9下記入力画面が表示されたら[×]をクリックします。
※コードにエラーがある場合、下記画面は表示されません。
9スクリプト確認画面.PNG

5.Power Automateフローの全体像

今回作成するPower Automateフロー(以下フロー)の全体像です。 Formsで回答を送信すると、フローが自動で実行されます。

10フロー全体1.PNG
11.フロー全体2.PNG

大まかな構成としては下記の順にフローが進みます。

  1. SharePointからExcelの雛形の中身情報を取得
  2. OneDriveにファイルを作成 + 1で取得した雛形の情報を登録
  3. Formsに入力した値を取得
  4. Office Scriptsを実行してOneDriveに作成したExcelファイルにFormsで入力した値を登録
  5. Excel ファイルをOneDrive内でPDF変換
  6. 変換したPDFファイルをSharePointに格納
  7. 2と4でOneDrive内に作成したExcelファイルを削除

6. Power Automateフローの各種設定

フローの各種設定について解説します。

▼トリガーの設定
トリガーは[新しい応答が送信されるとき]を選択します。
トリガーを選択するとフォームIDを設定する項目が表示されるのでFormsで作成したフォーム名を指定します。
12.トリガー.PNG

▼変数の設定
今回、PDF出力するファイルのファイル名が被らないように「(実行日付)_申込サービス出力先.pdf」として出力します。この実行日付の部分の値を格納するために変数を指定します。
具体的には「変数を初期化する」アクションを1つ追加し、以下のように設定します。
13変数初期化.PNG

設定値

Name Type Value
ファイル名日付 String formatDateTime(getFutureTime(9, 'Hour'), 'yyyy-MM-dd')

Valueの部分は「式」に入力します。

▼ファイルファイルコンテンツの取得
申込書の雛形のフォーマットを取得するために[ファイル コンテンツの取得]アクションを追加し、以下の設定を行います。

14.PNG

設定値

サイトのアドレス ファイル識別子 コンテンツタイプの推測
雛形を格納したSharePointサイト 雛形のファイルパス はい

▼ファイルの作成
OneDriveにファイルを作成するために[ファイルの作成]アクションを追加し、以下の設定を行います。
15.PNG

設定値

フォルダーのパス ファイル名 ファイルコンテンツ
任意のパスを指定 concat(variables('ファイル名日付'),'_申込サービス出力先.xlsx') 動的なコンテンツの「ファイルコンテンツの取得」から<本文>を選択

ファイル名の部分は「式」に入力します。

▼応答の詳細を取得する
Formsで入力された値を取得するために[応答の詳細を取得する]アクションを追加し、以下の設定を行います。
16.PNG

設定値

フォームID ファイルコンテンツ
Formsで作成したフォーム名を指定 動的なコンテンツの「新しい応答が送信されるとき」から<応答ID>を選択

▼スクリプトの実行
Office Scriptsを実行してOneDriveに作成したExcelファイルにFormsで入力した値を登録するために[スクリプトの実行]アクションを追加し、以下の設定を行います。
17.PNG

No 項目 設定値 備考
1 場所 OneDrive for Business
2 ドキュメントライブラリ OneDrive for Business
3 ファイル OneDrive for Business <名前>の部分は動的なコンテンツの「ファイル」から選択
4 スクリプト OneDrive for Business Office Scriptsの構築時に命名した名前を指定
5 ScriptParameters/aName* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
6 ScriptParameters/aFurigana* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
7 ScriptParameters/aEmail OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
8 ScriptParameters/bServiceName* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
9 ScriptParameters/bDesiredDay* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
10 ScriptParameters/bSalesPerson* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択
11 ScriptParameters/cRemarks* OneDrive for Business <名前>の部分は動的なコンテンツの「応答の詳細を取得する」から選択

▼ファイルの変換(pdf変換)
Office Scriptsを実行してFormsで入力した値が登録されたExcelファイルをPDF変換するために
[ファイルの変換]アクションを追加し、以下の設定を行います。
18.PNG

設定値

ファイル ターゲットの種類
動的なコンテンツの「ファイルの作成」からを選択 PDF

▼ファイルの作成(SharePointに格納)
PDF変換したファイルをSharePointに格納するために[ファイルの作成]アクションを追加し、以下の設定を行います。
19.PNG

サイトのアドレス フォルダーのパス ファイル名 ファイルコンテンツ
(PDF格納用ライブラリを作成したサイトを指定) (PDF格納用ライブラリのパスを指定) concat(variables('ファイル名日付'),'_申込サービス出力先.pdf') 動的なコンテンツの「ファイルの変換(pdf変換)」から<本文>を選択

ファイル名の部分は「式」に入力します。

▼10分待機
フロー内でExcelのテーブルを使うとそのExcelファイルは数分間ロックされる仕様のため、ファイルロックのエラーを回避するために、[遅延]アクションを追加し、以下の設定を行う。
20.PNG

設定値

count unit
10 Minute

▼ファイルの削除
OneDriveで作成したExcelファイルは不要になるので[ファイルの削除]アクションを追加し、以下の設定を行う
21.PNG

設定値

ファイル
動的なコンテンツの「ファイルの作成)」からを選択

7.動作確認

一通り、システムを構築したので実際の動きを確認します。

Formsに情報を入力し、[送信]ボタンをクリックします。
22.PNG
23.PNG

Power Automateの実行履歴からフローの処理が成功したことを確認します。
26.PNG
27.PNG

PDF格納用ライブラリにPDFが格納されたことを確認し、中身を開いて内容に問題がないことを確認します。
24.PNG
25.PNG

8.まとめ

Office ScriptsとPower Automateを使ったシステムの構築例をご紹介しました。本記事の内容は「フォーム入力→Excelに記録→PDFで保存」の流れを自動化したもので、申請業務の効率化や書類の自動生成に役立てることが可能です。 他にも、Office ScriptsとPower Automateを組み合わせることで売上データを自動集計したり、複数のExcelファイルのデータを自動で統合して一元管理できるようにしたりとExcelを使った業務を効率化させることが出来るので、是非本記事をきっかけにExcel業務の効率化に挑戦してみてください。

最後に

テンダでは、「こんなプロジェクトに挑戦したい」「こんなチームで働きたい」「理想のチームを創りたい」と願う仲間を求めています。 カジュアル面談も随時受付中です。ぜひ一度お話ししましょう。
募集職種一覧
カジュアル面談の申込
テンダで働く人や社風について

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?