見出し画像

【ChatGPT×GAS】あらゆる業務に応用◎自動PDF生成アプリで業務効率を劇的にアップしよう!

業務の中で、毎日同じような定型作業を繰り返すのは時間がかかり、
ストレスがたまりますよね?
そんな悩みを解決する方法の一つとして、最近注目なのが ChatGPT と Google Apps Script(GAS) を組み合わせた業務効率化のアイデアです!

「請求書をPDFにしてフォルダに保存したり、自動で入力してPDFを生成できたら…」その願い、実現できるんです!
今回は、ChatGPTとGASの組み合わせで定型作業をどう効率化できるかを紹介します!

今回の担当


定型作業の効率化の必要性

多くの企業で、定型作業は時間がかかるにもかかわらず、ルーチンワークとして重要な部分を担っています。例えば、請求書の作成、データの整理、報告書の作成など、これらは手作業で行うとミスも生じやすく、時間も奪われます。

そこで、自動化ツールを導入することで、人的リソースを節約し、他の重要な業務に時間を割けるようになります。特にChatGPTの自然言語処理能力とGASのプログラム自動化が連携することで、効率化の可能性は飛躍的に広がります!

ChatGPTとGASを組み合わせた活用事例

GASでできることは多岐に渡ります。
メールの送信、Googleカレンダーとの連携、スプレッドシートのデータ整理や自動処理などなど…

今回は、ChatGPTにGASのコードを生成してもらい、スプレッドシートの自動処理を行って2パターンの業務効率化を図ってみようと思います!

⚠️ ChatGPTで出力されるコードはその時々で異なります。今回実装するにあたって、一回では上手くいかず修正した点を最後に記載していますので、ご参考にしていただけますと幸いです。

1.請求書をPDFに変換し、任意のフォルダに保存

まず最初に紹介するのは、スプレッドシートで作成した請求書のPDF変換の自動化です。
手作業で毎回請求書をPDFにして、フォルダに保存するのは意外と時間がかかりますよね。PDFに変換し、Googleドライブ内の指定フォルダに保存する機能をGASで作ると、作業は一気に楽になります!

🧑‍💻 実装方法
スプレッドシートにて、ダミーの請求書を用意しました。

このシートをPDFに変換して保存するスクリプトを、
ChatGPTに作成してもらいましょう!

💬 プロンプト

スプレッドシートの現在のシートをPDFに変換してドライブに保存するGASを作成してください。
* 現在のシートのみをPDFに変換
* 出力先フォルダ:https://drive.google.com/drive/folders/XXXXX
* ファイル名はシート名と同じとする('Invoice_' + シート名+ '.pdf')

ChatGPTにプロンプトを送信します!

出力されたコードがこちらです!
※フォルダIDは任意のものに書き換えます

function exportCurrentSheetToPDF() { // 現在のスプレッドシートとシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet();
// フォルダIDを設定(指定されたURLからフォルダIDを取得)
 var folderId = 'XXXXX'; 
// フォルダIDに置き換えてください
 var folder = DriveApp.getFolderById(folderId);
// シート名を取得し、ファイル名を生成
 var sheetName = sheet.getName(); var fileName = 'Invoice_' + sheetName + '.pdf';
// スプレッドシートのIDを取得
 var ssId = ss.getId();
// PDFエクスポート用のパラメータ
 var url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?' +
 'format=pdf' + 
 '&size=A4' +           // 用紙サイズ
 '&portrait=true' +     // 縦向き
 '&fitw=true' +         // 幅に合わせて調整
 '&sheetnames=false' +  // シート名を表示しない
 '&printtitle=false' +  // スプレッドシートのタイトルを表示しない '&pagenumbers=false' + // ページ番号を表示しない
 '&gridlines=false' +   // グリッド線を表示しない
 '&fzr=false' +         // 凍結行を印刷しない
 '&gid=' + sheet.getSheetId(); // 現在のシートID
// PDFファイルとしてエクスポート
 var token = ScriptApp.getOAuthToken();
 var response = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } });
var blob = response.getBlob().setName(fileName);
// 指定フォルダに保存
 var file = folder.createFile(blob);
Logger.log('PDFファイルが作成され、フォルダに保存されました: ' + file.getUrl()); }

「 // 」で始まる文章は「コメント」と呼ばれ、主に処理の説明等を記載する際に使われます。
この「コメント」が各処理に記載されていて、何の処理を行っているのかわかりやすいですね!

💻 GASの実装
では実際にGASを使えるように設定していきましょう!
スプレッドシートから、拡張機能タブをクリックし、「Apps Script」を選択します。

すると「Apps Script」という開発画面が表示されます。
左上の「無題のプロジェクト」という箇所を任意の名前に変更しておきます。
また、最初から「コード.gs」というスクリプトが作成されているので、
これを編集するか、もしくは「+」マークから新規のスクリプトを作成します!

動画では、新規のスクリプトを作成しています。

作成できたら保存し、
実行ボタンをクリックし実行してみます!

実行が完了すると、画面下部に「実行ログ」が表示されます。
完了したので、指定したフォルダを見てみます!

PDFが作成・保存されていることが確認できました!

請求先や明細が入った正しいシートがPDFとして出力されています。

ChatGPTにコードを生成してもらうことで、あっという間にスプレッドシートをPDFに変換・指定フォルダに格納する機能を実装することができました!

2.請求データを自動入力し、PDFに変換+任意のフォルダに保存

続いて、このスクリプトを活かしてより高度な業務効率化を図っていきます!
今回は請求管理シート作成し、
顧客IDや請求番号、取引先名、請求明細の各項目を用意しました!
この請求管理シートをもとに、指定した顧客IDに紐づく請求データを請求書シートに自動入力させ、PDF化まで行ってみます!

🔧 実装したい処理フロー
1️⃣ ユーザが顧客IDを入力する(どんな形で入力させるか、この時点ではChatGPTにお任せ)

2️⃣ 請求管理シートを見にいき、顧客IDが一致する請求情報を取得

3️⃣ 請求書シートを複製し、複製シートに取得した請求情報を入力

4️⃣ PDFに変換し、指定フォルダに保存

ではChatGPTにさっそく聞いてみます!

💬 プロンプト

下記のスクリプトを、要件に合うように修正してください。
請求書スプレッドシート: https://docs.google.com/spreadsheets/d/XXXXX

#要件
- ユーザが顧客IDを手入力できる
- 「請求管理」シートから、入力された顧客IDと合致する請求情報を取得
- 「請求書」シートを複製し、取得した請求番号をシート名にする
- 顧客ID1つに対して複数の明細がある場合を考慮する
- E列「取引先名」の、値に’ ‘(半角スペース)と’御中’を付加してデータを格納する

#データの格納
E列「取引先名」は、値に’ ‘(半角スペース)と’御中’を付加してデータを格納する。
請求管理シートで取得した情報は、下記のセルにセットする。
- B列(請求番号):O4
- C列(請求先郵便番号):B6
- D列(請求先住所):B7
- E列(取引先名):B5
- F列(日付):B16
- G列(請求内容):D16
- H列(単価):M16
- I列(数量):K16
- J列(税率):O16
- K(支払期日):C38
ただし、複数のレコードがある場合、F列〜J列の値は17行目以降に順番に格納していくこととする。
# スクリプト
(先ほどのスクリプトを転記)

入力するセルは自動で判定されないので、プロンプトで事前に指定しています!

出力されたコードはこちらです!
※シートIDとフォルダIDは任意のものに書き換えます

// スプレッドシートを開いたときに「請求書メニュー」を追加する
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('請求書メニュー') // メニュー名
    .addItem('顧客IDを入力して請求書を作成', 'userPromptForCustomerId') // ボタン名と呼び出す関数
    .addToUi();
}

// 顧客IDを入力して請求書を作成するプロンプト表示
function userPromptForCustomerId() {
  var ui = SpreadsheetApp.getUi(); // UIの取得
  var response = ui.prompt('請求書作成', '顧客IDを入力してください。', ui.ButtonSet.OK_CANCEL);

  // OKボタンが押された場合のみ処理を続行
  if (response.getSelectedButton() == ui.Button.OK) {
    var customerId = response.getResponseText(); // 入力された顧客IDを取得
    
    if (customerId === '') {
      ui.alert('顧客IDが入力されていません。');
      return;
    }

    // 顧客IDを基に請求書を作成
    var result = createInvoiceFromCustomerID(customerId);
    
    // 結果をユーザに通知
    ui.alert(result.getContent());
  } else {
    ui.alert('操作がキャンセルされました。');
  }
}

// 顧客IDを基に請求書を作成し、そのシートをPDFに変換する関数
function createInvoiceFromCustomerID(customerId) {
  var ss = SpreadsheetApp.openById('XXXXXX'); // あなたのスプレッドシートID
  var invoiceManagementSheet = ss.getSheetByName('請求管理'); // 請求管理シート
  var templateSheet = ss.getSheetByName('請求書'); // テンプレートシート
  
  // 「請求管理」シートから、入力された顧客IDと合致する請求情報を取得
  var data = invoiceManagementSheet.getDataRange().getValues();
  var filteredData = [];
  
  for (var i = 1; i < data.length; i++) { // ヘッダーをスキップ
    if (data[i][0] == customerId) { // A列の顧客IDで一致するものを抽出
      filteredData.push(data[i]);
    }
  }
  
  if (filteredData.length === 0) {
    return ContentService.createTextOutput('該当する顧客IDが見つかりませんでした。');
  }
  
  // シートを複製し、請求番号をシート名にする
  var invoiceNumber = filteredData[0][1]; // B列(請求番号)
  var newSheet = templateSheet.copyTo(ss).setName(invoiceNumber);
  
  // シート更新を強制
  SpreadsheetApp.flush();

  // 複製されたシートのIDを取得
  var targetSheet = ss.getSheetByName(newSheet.getName());
  var targetSheetId = targetSheet.getSheetId();
  
  // ログで確認
  Logger.log('Created sheet: ' + newSheet.getName());
  Logger.log('Sheet ID: ' + newSheet.getSheetId());
  Logger.log('Exporting sheet with ID: ' + targetSheetId);

  // シート更新後の必要なデータの配置
  newSheet.getRange('O4').setValue(invoiceNumber);
  newSheet.getRange('B6').setValue(filteredData[0][2]);
  newSheet.getRange('B7').setValue(filteredData[0][3]);
  newSheet.getRange('B5').setValue(filteredData[0][4] + ' 御中');
  newSheet.getRange('C38').setValue(filteredData[0][10]);

  // 複数レコード対応: F列〜J列の値を17行目以降に順番に格納
  var startRow = 16;
  for (var i = 0; i < filteredData.length; i++) {
    newSheet.getRange('B' + (startRow + i)).setValue(filteredData[i][5]); // F列(日付)
    newSheet.getRange('D' + (startRow + i)).setValue(filteredData[i][6]); // G列(請求内容)
    newSheet.getRange('M' + (startRow + i)).setValue(filteredData[i][7]); // H列(単価)
    newSheet.getRange('K' + (startRow + i)).setValue(filteredData[i][8]); // I列(数量)
    newSheet.getRange('O' + (startRow + i)).setValue(filteredData[i][9]); // J列(税率)
  }

  // 複製したシートをアクティブ化してPDFエクスポートの対象に設定
  newSheet.activate();  // 確実に複製したシートをアクティブにする
  SpreadsheetApp.flush();  // 変更を反映

  // 作成したシートをPDFに変換して保存する処理
  var folderId = 'XXXXXX'; // 保存先フォルダIDに置き換えてください
  var folder = DriveApp.getFolderById(folderId);

  // ファイル名を生成
  var fileName = 'Invoice_' + invoiceNumber + '.pdf';

  // スプレッドシートのIDを取得
  var ssId = ss.getId();

  // PDFエクスポート用のパラメータで新しく作成したシートのIDを使用
  var url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?' +
            'format=pdf' +
            '&size=A4' +          // 用紙サイズ
            '&portrait=true' +     // 縦向き
            '&fitw=true' +         // 幅に合わせて調整
            '&sheetnames=false' +  // シート名を表示しない
            '&printtitle=false' +  // スプレッドシートのタイトルを表示しない
            '&pagenumbers=false' + // ページ番号を表示しない
            '&gridlines=false' +   // グリッド線を表示しない
            '&fzr=false' +         // 凍結行を印刷しない
            '&gid=' + targetSheetId; // 複製されたシートのIDを使用

  Logger.log('PDF Export URL: ' + url); // URLをログに記録

  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + token
    }
  });

  var blob = response.getBlob().setName(fileName);
  var file = folder.createFile(blob);

  return ContentService.createTextOutput('請求書の作成とPDFの保存が完了しました: ' + file.getUrl());
}

先ほどと同様、「コメント」を読んでみると、
必要な機能のコードが生成されていることを確認できますね⭐️

このコードをコピーし、前回と同じくApps Scriptを開いてスクリプトを作成していきます!
赤枠の箇所が保存ボタンです。保存することを忘れずに!
(ショートカットキー Cmd/Ctrl + Sでも保存できます)

では実行してみましょう!!

ヘッダーに「請求書メニュー」というカスタムメニューが表示されています。
これをクリックすると、顧客IDを入力できる画面が表示され、入力した顧客IDをもとに請求データを入力したシートが作成されていますね!
PDFの方も確認してみます。

正しいシートがPDFに変換されていることを確認できました!
大成功です!
これで任意の情報を入力し格納するところまでを自動化することができました!

まとめ

今回は、GASとChatGPTを組み合わせて定型作業の効率化を行ってみました!
この2つの例からわかる通り、ChatGPTの柔軟な対話型インターフェースと、GASの強力な自動化スクリプトが組み合わさることで、業務効率化の幅が一気に広がります!

ここで大事なこと
ここまで順調にコードを生成・実行できているように書いてきましたが、
実は数回ChatGPTとやり取りし、修正した後のプロンプトとコードを記載しています💦
最後に手こずった点をご紹介します。

1️⃣ 入力できるようになっていない 
 ← 受け渡された後の処理は実装はできているものの、どこから入力すれば良いの!??という状態でした

2️⃣ PDFに変換されたシートがテンプレートシートになっている
 ← シート指定の変数設定など、数回試して調整

3️⃣「請求書メニュー」が消えた
 ← そんなこんな修正をしているうちに、1️⃣で作成した請求書メニュー部分が欠落した状態のコードが生成されるように

などなど。一回の指示で成功するものが生成されれば良いのですが、実行してみるとエラーが表示されるなんてことも。

また、こうした自動化のプロセスは一度セットアップすれば万能というわけではなく、時には微調整が必要になることもあります。
GASに少し慣れておくと、業務にあわせた柔軟な対応がしやすくなるのでおすすめです!

SAMURAI では、GASやChatGPTについて学べるレッスンを提供しています。
初心者でもわかりやすく、自動化に必要な知識を段階的に習得できるので、是非チェックしてみてください!


GASとChatGPTを使った業務効率化は、現代のビジネス環境で非常に強力なツールです!
請求書の自動作成やデータの自動入力、はたまたレポート作成など、あらゆる定型業務が効率化され、時間と手間を大幅に削減できます。
さらに、GASを学ぶことで、さらに複雑な自動化フローを構築できるようになり、効率化の可能性は無限に広がります。

定型作業の負担を減らし、よりクリエイティブな業務に集中できる未来へ、一歩踏み出してみませんか?


この記事が参加している募集