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]
2. 入力フォーム [Google フォーム]
3. 入力内容 [Google Spreadsheet]
4. スクリプト・エディタを開き、コードを実行
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", "");}
}
}
ファイルとメールに絡む作業の自動化はだいぶGoogle App Scriptでできるイメージが湧いたので、とてもいい教材でした。
参考にしたもの
以下のページを特に参考にさせてもらいました。ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?