非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

GASで文書管理システムを作った

      2023/03/10

Google Apps Script(GAS)で文書管理システムを作ったので紹介します。文書はドキュメント、台帳はスプレッドシートで作成しスプレッドシート側にGASを実装しています。尚、コアな機能のみでエラー処理などは省いています。実際運用する際はそのあたりの処理を実装する必要あります。

システムの概要

ソースコードを紹介する前にシステムの一連の動きについて紹介したいと思います。同じフォルダ内に文書のテンプレートと台帳が置かれています。

台帳ファイルにはまず登録シートがあり、ここで文書の新規登録を行います。

 

こちらが台帳シート。登録シートで登録するとここに書き溜められます。

 

こちらが報告書のテンプレートです。台帳に登録したタイミングでこれをコピーして登録内容に従って文章が入力されるようになります。

 

文書管理システムの一連の流れ

まず登録シートにて部署名、氏名、報告署名を入力し「登録」ボタンを押します。

 

すると、報告書Noが自動採番され、以下のようなウィンドウが現れます。指定されたURLをクリックしましょう。

 

文書ファイルが開きます。先程紹介したテンプレートに必要事項が自動で入力されていることがわかるかと思います。あとは報告内容を手入力すれば文書の完成です。

 

台帳には以下のように追加されています。以降は文書Noを新たに採番しながら追加されていきます。

 

Googleドライブのフォルダ内を見てみるとテンプレートからコピーされた文書ファイルが確認できるかと思います。ファイル名は「文書No+報告書タイトル」としておきました。

ソースコード

ソースコードはこちらです。今回の例では関数registerは登録ボタン、関数clearはクリアボタンで実行するようになっています。

function register(){
  let sheet = SpreadsheetApp.getActive().getSheetByName('登録シート');
  let ledger = SpreadsheetApp.getActive().getSheetByName('台帳');
  let lastlow = ledger.getLastRow();
  lastlow++;
  let ctrlNum = 'DOC-' + (('000' + (lastlow-3)).slice(-3));
  let dt = new Date();
  let dep = sheet.getRange("C6").getValue();
  let name = sheet.getRange("C7").getValue();
  let title = sheet.getRange("C8").getValue();

  //登録シートに文書Noと日付を表示
  sheet.getRange("C4").setValue(ctrlNum);
  sheet.getRange("C5").setValue(dt);
  //台帳に登録
  ledger.getRange(lastlow,1).setValue((lastlow-3));
  ledger.getRange(lastlow,2).setValue(ctrlNum);
  ledger.getRange(lastlow,3).setValue(dt);
  ledger.getRange(lastlow,4).setValue(dep);
  ledger.getRange(lastlow,5).setValue(name);
  ledger.getRange(lastlow,6).setValue(title);
  //テンプレートをコピー
  const dicID = "10sMNkxa4wRXzhLn-wytMt749JJLJu9zX221llbmGLPg";
  const fileName = ctrlNum +'_'+ title;
  var sourcefile = DriveApp.getFileById(dicID);
  newfile = sourcefile.makeCopy(fileName);
  //文章の置換
  var doc = DocumentApp.openById(newfile.getId());
  let body = doc.getBody();
  body.replaceText('{DATE}', Utilities.formatDate(dt,"JST","yyyy年MM月dd"));
  body.replaceText('{DEPART}', dep);
  body.replaceText('{NAME}', name);
  body.replaceText('{NUMBER}', ctrlNum);
  body.replaceText('{TITLE}', title);
  //生成したドキュメントを開く
  var url = "https://docs.google.com/document/d/" +newfile.getId()+ "/edit";
  var script = "<a href='" +url+ "' target='_blank'>" +url+ "</a>";
  var html = HtmlService.createHtmlOutput(script);
  SpreadsheetApp.getUi().showModalDialog(html, 'URLをクリックしてください。');
}

function clear(){
  let sheet = SpreadsheetApp.getActive().getSheetByName('登録シート');
  sheet.getRange("C4:C8").clearContent();
}
 

 

 

実際の運用に関して

今回の例は必要最小限に留めていて、冒頭で説明した通りエラー処理を実装する必要があります。

また、今回の例では一度登録した内容を編集する際は台帳に直接修正することになりますが、文書Noの編集をも可能になってしまうので、本来なら編集も登録シートからできるようにするべきだと思います。また台帳シートは別ファイル化した方が事故が起きにくいでしょう。

今回のコアな機能に加えて実際の運用に際してはもう少し機能追加が必要になると思います。

 

一覧の動きがわかるように動画にしておきました

スポンサーリンク

 - Google Apps Script