見出し画像

Google App Scriptで定型契約書作成を自動化してみた

一度、自分の作ったプログラムを公開する、というのをやってみたかったので公開してみました。GASのエントリーはたくさんありますが、Google Documentが絡むエントリーはあんまりなかったので、書いてみました。


動機

弊社では初回の取引が始まりそうなタイミングで、2種類の契約書を作成しています。その際にテンプレートのWordファイルで要変更箇所をお客様名・契約開始時期に合わせて変更するという作業が発生します。1回あたり2,3分で終わる作業ではあるものの、ちゃんと全部間違えずに変更できたかなーというのを不安になりながら作業をするのが、嫌だったので、自動化する方法を考えました。

Wordファイルなので、VBAが向いているとは思いつつ、気乗りしなかったので、会社として使っていく方向性であるGoogle のサービスを利用した自動化を検討しました。Googleのサービスの自動化を調べると、基本はGoogle App Script(以下GAS)ということになるので、様々なブログを参考にさせてもらいながら、実装してみました。

実行環境がVBAと違いクライアントでなく、GASはサーバーサイドなので、安定しているし、スケジュールもしやすいという点を体感でき、将来的にも色々使えそうなイメージが湧きました。


実装できたもの
結果的に狙い通りのものが実装できました。
1. 契約書テンプレートをGoogle Docsで所定のフォルダに準備
2. Google フォームに必要な情報を入力
3. Google スプレッドシートに出力
4. Google ドライブの所定のフォルダに1のテンプレート・コピーを出力し、2の情報を所定の位置に置換(Wordファイルとしてもダウンロード可能)


利用イメージとプログラム
1. 契約書テンプレートの抜粋(※置換対象部分) [Google Docs]

画像6

画像11

画像8

画像9

2. 入力フォーム [Google フォーム]

画像7

画像2

3. 入力内容 [Google Spreadsheet] 

画像9

画像11


4. スクリプト・エディタを開き、コードを実行

画像5

  function createContract() {
 //Google Formに入力された情報を元に、契約書を作成するプログラム  

 // 最終行が何行名か取得する
 var sheet = SpreadsheetApp.getActiveSheet();
 var lastRow = sheet.getLastRow();
   
 // 入力された値を取得する。変数はvarで定義
 var basicContract = sheet.getRange(lastRow, 3).getValue();   // 業務委託基本契約書の作成要否確認
 var NDA = sheet.getRange(lastRow, 15).getValue();   // 機密保持契約書の作成要否確認

 var Company1 = sheet.getRange(lastRow, 4).getValue();  // Company1(甲)を取得
 var Company2 = sheet.getRange(lastRow, 5).getValue();  // Company2(乙)を取得
 var CPNO = sheet.getRange(lastRow, 6).getValue() // 顧客番号3桁を取得

 var contractDate = sheet.getRange(lastRow, 7).getValue();  // 契約開始日を取得
 var Y1 = contractDate.getFullYear(); // 契約開始日(年)を取得
 var M1 = contractDate.getMonth() +1; //  契約開始日(月)を取得 月は-1された値が返されるので、要注意
 var D1 = contractDate.getDate();    // 契約開始日(日)を取得
    
 var startDate = sheet.getRange(lastRow, 8).getValue();  // 有効期限開始日を取得
 var Y2 = startDate.getFullYear();
 var M2 = startDate.getMonth() +1; // 月は-1された値が返されるので、要注意
 var D2 = startDate.getDate(); 

 var enddate = new Date(startDate);  // 有効期限開始日から+1年-1日した日付を計算
 enddate.setFullYear(enddate.getFullYear() + 1);
 enddate.setDate(enddate.getDate() - 1); 
 var Y3 = enddate.getFullYear(); 
 var M3 = enddate.getMonth() +1;  // 月は-1された値が返されるので、要注意
 var D3 = enddate.getDate();
   
 // 捺印欄に印字する場合に置換する情報
 var Address1A = sheet.getRange(lastRow, 9).getValue();
 var Address1B = sheet.getRange(lastRow, 10).getValue();
 var StampCom1 = sheet.getRange(lastRow, 16).getValue();   // 捺印欄に会社名を記載するか否か
 var Person1 = sheet.getRange(lastRow, 11).getValue();
 var Address2A = sheet.getRange(lastRow, 12).getValue();
 var Address2B = sheet.getRange(lastRow, 13).getValue();
 var StampCom2 = sheet.getRange(lastRow, 17).getValue();   // 捺印欄に会社名を記載するか否か
 var Person2 = sheet.getRange(lastRow, 14).getValue();

 // 契約書上部に表示する年月日を8桁で表示 1桁の場合は0埋め
 var YYYYMMDD =  contractDate.getFullYear()+
	( "0"+( contractDate.getMonth()+1 ) ).slice(-2)+
	( "0"+contractDate.getDate() ).slice(-2);
 
 // ファイル名を定義
 var File1 = YYYYMMDD +"_業務委託基本契約書_" + Company1 + "_" + Company2;
 var File2 = YYYYMMDD +"_機密保持契約書_" + Company1 + "_" + Company2;

 // 出力先フォルダのIDを指定し、出力先を定義する  #################--#################を実際のフォルダIDに変換
 var OutputFolder = DriveApp.getFolderById('#################--#################');

   
   
 // 業務委託基本契約書ファイル作成  basicContractがYesの場合のみ
   if(basicContract === 'Yes'){     
 // テンプレートファイルを定義する。#################-#################をファイルIDに変換
 var templateFileBC = DriveApp.getFileById('#################-#################');
 // 出力ファイル名を定義する「業務委託基本契約書」
 var newfile = templateFileBC.makeCopy(File1, OutputFolder);
 // 出力ファイルのIDを取得する    
 var id_copy_file = newfile.getId();   
 // 置換処理を行うファイルIDを定義する    
 var doc = DocumentApp.openById(id_copy_file);
 // 置換処理を行うbodyを定義する       
 var body = doc.getBody();
 // 置換処理を行う   
 body.replaceText("Company1", Company1);
 body.replaceText("Company2", Company2);
 body.replaceText("CPNO", CPNO);
 body.replaceText("contractDate", contractDate);
 body.replaceText("Y1", Y1);
 body.replaceText("M1", M1);
 body.replaceText("D1", D1);
 body.replaceText("startDate", startDate);
 body.replaceText("Y2", Y2);
 body.replaceText("M2", M2);
 body.replaceText("D2", D2);
 body.replaceText("Y3", Y3);
 body.replaceText("M3", M3);
 body.replaceText("D3", D3);
 body.replaceText("Address1A", Address1A);
 body.replaceText("Address1B", Address1B);
 body.replaceText("Person1", Person1);
 body.replaceText("Address2A", Address2A);
 body.replaceText("Address2B", Address2B);
 body.replaceText("Person2", Person2);
 body.replaceText("YYYYMMDD", YYYYMMDD);
     

 // 捺印欄に印字する場合   
 if(StampCom1 === 'Yes'){ 
 body.replaceText("StampCom1", Company1);}
 if(StampCom1 === 'No'){ 
 body.replaceText("StampCom1", "");}    
 if(StampCom2 === 'Yes'){ 
 body.replaceText("StampCom2", Company2);}
 if(StampCom2 === 'No'){ 
 body.replaceText("StampCom2", "");}
 }  


   
   
   
 // 機密保持契約書ファイル作成    NDAがYesの場合のみ
 if(NDA === 'Yes'){     
 // テンプレートファイルを定義する    #################-#################をファイルIDに変換
 var templateFileNDA = DriveApp.getFileById('#################-#################');
 // 出力ファイル名を定義する「機密保持契約書」
 var newfile2 = templateFileNDA.makeCopy(File2, OutputFolder);
 // 出力ファイルのIDを取得する    
 var id_copy_file = newfile2.getId();   
 // 置換処理を行うファイルIDを定義する    
 var doc = DocumentApp.openById(id_copy_file);
 // 置換処理を行うbodyを定義する       
 var body = doc.getBody();
 // 置換処理を行う   
 body.replaceText("Company1", Company1);
 body.replaceText("Company2", Company2);
 body.replaceText("CPNO", CPNO);
 body.replaceText("contractDate", contractDate);
 body.replaceText("Y1", Y1);
 body.replaceText("M1", M1);
 body.replaceText("D1", D1);
 body.replaceText("startDate", startDate);
 body.replaceText("Y2", Y2);
 body.replaceText("M2", M2);
 body.replaceText("D2", D2);
 body.replaceText("Y3", Y3);
 body.replaceText("M3", M3);
 body.replaceText("D3", D3);    
 // 捺印欄に印字する場合   
 body.replaceText("Address1A", Address1A);
 body.replaceText("Address1B", Address1B);
 body.replaceText("Person1", Person1);
 body.replaceText("Address2A", Address2A);
 body.replaceText("Address2B", Address2B);
 body.replaceText("Person2", Person2);
 if(StampCom1 === 'Yes'){ 
 body.replaceText("StampCom1", Company1);}
 if(StampCom1 === 'No'){ 
 body.replaceText("StampCom1", "");}    
 if(StampCom2 === 'Yes'){ 
 body.replaceText("StampCom2", Company2);}
 if(StampCom2 === 'No'){ 
 body.replaceText("StampCom2", "");}
 }  
   
 }

画像10


ファイルとメールに絡む作業の自動化はだいぶGoogle App Scriptでできるイメージが湧いたので、とてもいい教材でした。


参考にしたもの
以下のページを特に参考にさせてもらいました。ありがとうございました。



この記事が気に入ったらサポートをしてみませんか?