[GAS]Googleフォームとスプレッドシート連携・PDF化・カレンダー・メール連携する。

#この記事の目的
Googleフォームから、スプレッドシート・Gmail・Googleカレンダーと連携するシステムを作成する時の基本となる知識を、簡単なシステムを作りながらまとめます。


#ワークフロー
下記のような商品発注システムを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/cc907823-8ff3-b52f-f808-9b319d0311e5.png)
ユーザは商品発注をGoogleフォームから行うと、見積書スプレッドシートが作成されます。さらにそれをPDF化してGoogleDriveに保存します。そのPDFを添付した受付完了メールを送信し、発送日をGoogleカレンダーに登録します。


#構成要素
この記事では下記が登場します。

- SpreadSheet File
    - 見積書スプレッドシート
    - 見積書作成Googleフォームと紐づいた回答記録用スプレッドシート    
- Form File
    - 見積書作成Googleフォーム
- Folder
    - 見積書を作成したあとに保存するフォルダ
- Script File
    - 「見積書作成Googleフォームと紐づいた回答記録用スプレッドシート」と紐づいたGASファイル
- Googleカレンダー
    - 商品発送カレンダー


#実装
##見積書スプレッドシートを作成する。
今回はこちらから見積書テンプレートをお借りしました。
https://taromoteki.com/freelance-document-template/


##見積書作成Googleフォームを作成する。
フォームを作成します。フォーム作成方法は省略します。


##見積書作成Googleフォームと紐づいた回答記録用スプレッドシートを作成する。
作成したフォームを編集モードで開きます。
回答タブをクリック→スプレッドシートマークをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/dec080c5-7aa5-df6f-c56d-dfac06c89fdf.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/e0e6f216-2a67-fc42-58d5-f0941d2b8b48.png)
→新しいスプレッドシートを作成をクリック


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/543a3657-6acb-28ee-8e07-9fb6687584c7.png)


##GASファイルを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/0aeeaf39-e9b8-85d5-29c4-a364a9cceb59.png)
「見積書作成Googleフォームと紐づいた回答記録用スプレッドシート」のコンテナバインドスクリプトを作成します。


##GASコーディング

```Javascript:GAS
var QuoteStId = "見積書スプレッドシートID"; 
var FolderId = "見積書PDFを保存するフォルダID";
var mailaddress = "メールアドレス"
var calId = "GoogleカレンダーID";
var stname = "フォームと連携したスプレッドシートの見積書シートのシート名";

function QreateQuatationByForm() {
  var myForm = SpreadsheetApp.getActive();
  var stForm = myForm.getSheetByName(stname);  
  var maxRow = stForm.getLastRow();
  
  //フォームに入力された内容を読み取る処理
  var name = stForm.getRange(maxRow, 2).getValue();
  var address = stForm.getRange(maxRow, 3).getValue();
  var tel = stForm.getRange(maxRow, 4).getValue();
  var fax = stForm.getRange(maxRow, 5).getValue();
  var item1_name = stForm.getRange(maxRow, 6).getValue();
  var item1_price = stForm.getRange(maxRow, 7).getValue();
  var item1_qty = stForm.getRange(maxRow, 8).getValue();
  var eventdate = new Date(stForm.getRange(maxRow, 9).getValue());
  /*
  内容を読み取る処理が続きますが、省略します。
  */

  
  //新規スプレッドシートのファイル名を生成する処理
  var date = new Date();
  var filename = Utilities.formatDate(date, "JST", "YYYYMMDDHHmm_見積書");
  
  //請求書を原本から複製する処理
  var folder = DriveApp.getFolderById(FolderId);
  var SSQuote = DriveApp.getFileById(QuoteStId); // コピー元のファイルIDを取得＆入力
  var newfile = SSQuote.makeCopy(filename, folder);
  var idNewfile = newfile.getId();
  var SSQuote = SpreadsheetApp.openById(idNewfile);
  var stQuote = SSQuote.getSheetByName("見積書")
  stId = stQuote.getSheetId();
  
  
  //請求書に書き込む処理
  stQuote.getRange(6, 1).setValue(name);
  /*
  書き込む処理が続きますが、省略します。
  */
  
  //カレンダーに書き込む処理
  var cal = CalendarApp.getCalendarById(calId);
  var title = name + "納品";
  cal.createAllDayEvent(title, eventdate);
  
  //PDF化
  SpreadsheetApp.flush();
  var url = "https://docs.google.com/spreadsheets/d/" + QuoteStId + "/export?exportFormat=pdf&gid=SID".replace("SID",stId);
  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url,{
    headers:{
      "Authorization" : "Bearer "+ token
    } 
  });
  
  //PDFファイルをGoogleドライブに保存する処理
  var blob = response.getBlob().setName(filename);
  var file = folder.createFile(blob);
  
  var to = mailaddress;
  var subject = "this is test mail";
  var body = "Hello. This is a test email. I hope you can read this email.";
  var options = {
    attachments: [file] //配列で入れること！
  };
  GmailApp.sendEmail(to, subject, body , options);
}
```



##GASプロジェクトのトリガーを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/6b665016-3fde-b553-92ea-ca67c45c42ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/f3a4aee7-1b8b-9016-3783-4ad0832ab905.png)
イベントの種類を「フォーム送信時」にする。


#コードの説明
コードの詳細については下記に補足記事を書きましたのでよろしければご参照ください。

## カレンダーに書き込む
GASでGoogleカレンダーに予定を追加する
https://qiita.com/jooji/items/b9d6bd0ed15d187b18d8

## PDF変換・GoogleDrive保存
GAS スプレッドシートをPDFに変換してGoogleDriveに保存する(シート単位)
https://qiita.com/jooji/items/24ac7fb30fbb4443b5a6




#おわり