---
# System prepended metadata

title: Google表單 + Line通知 (10802-讓雲端工具提昇工作效率)
tags: [整合運用]

---

Google表單 + Line通知 (10802-讓雲端工具提昇工作效率)
===
###### tags: `整合運用`
---
Google表單
---
1. 輕鬆建立以所有人為對象的問卷調查和表單
2. 建立自訂的問卷表單不需要額外支付任何費用。受訪者的答案會自動填入 [Google 試算表](http://sheets.google.com/)，讓您立即就能分析資料。
3. 企業帳號，可以限定同網域帳號才能填表單
4. 自動回覆，填報內容，請開「設定/一般/收集電子郵件地址」

Line通知
---
1. [Line Notify](https://notify-bot.line.me/zh_TW/)
2. 只要與其他網路服務完成連動設定，您即可透過「LINE Notify」官方帳號接收該網路服務的通知訊息。
3. 請先登入「Line Notify」
4. 至「個人頁面」
![](https://i.imgur.com/nTllMNE.png)

5. 畫面捲至最下方
![](https://i.imgur.com/oLCuy99.png)

6. 發行權杖，只會出現一次，請自行記住，方便日後使用


Google表單+Line通知
---
1. 請先建立表單
2. 設定「收集電子郵件地址」
3. [民宿管理範例](https://docs.google.com/forms/d/14Qes6TszOz9DYCrw4KdNq0vtyTFJIVwfZA6X6XwJkX0/edit?usp=sharing)
4. [表單填寫](https://docs.google.com/forms/d/e/1FAIpQLSf79QO2gJfW3stblmqv7phlJsJRCRG02M0mTss58MrpE_XfsQ/viewform)
5. 權限設定
![](https://i.imgur.com/crohALo.png)

5. 指令碼編輯器
![Uploading file..._rypjg0j1v]()

檔名：專案檔名建議與表單名稱一樣
時區：檔案/專案屬性/時區 => GMT +08:00 台北 (擁有者才能修改)
![](https://i.imgur.com/UnHsXml.png)

![](https://i.imgur.com/Bt5bEnO.png)


```javascript=
function getFormResponse() {  
  //由表單 Id 開啟表單
  var form = FormApp.openById("XXXXXX-Google表單ID");
  
  //取得表單名稱
  var formTitle = form.getTitle();
  
  //取得表單回覆內容
  var formResponse = form.getResponses();   
  
  //處理表單上問答內容
  for(var i = 0; i < formResponse.length ; i++){
    
    //取得表單上的項目
    var itemResponses = formResponse[i].getItemResponses();
    
    //取得表單上「收集電子郵件地址」
    var itemRespondentEmail = formResponse[i].getRespondentEmail();
    //Logger.log(itemRespondentEmail);
    
    //傳送訊息設定
    var itemContext = formTitle + "\n 填報者電子郵件 : " + itemRespondentEmail + "\n";
        
    //將表單每一項問答組成訊息
    for(var j = 0; j < itemResponses.length ; j++)
    {       
      //取得問題標題
      itemContext += itemResponses[j].getItem().getTitle();    
      
      //取得問題回覆內容
      itemContext += " : " + itemResponses[j].getResponse() + "\n";
    }    
    
    //取得填寫表單時間
    itemContext += "\n填寫時間 : " + formResponse[i].getTimestamp() + "\n\n";
    
    //送出表單到Line
    sendToLine(itemContext);
  }
  
  //刪除回應問題
  form.deleteAllResponses();
}

function sendToLine(message){
  //填入Line Notify 權杖 繳費通知單
  var token = "XXXXXX-LineNotify權杖";
  
  var options =
  {
      method  : "post",
      payload : "message=" + message,
      headers : {"Authorization" : "Bearer "+ token},
      muteHttpExceptions : true
  };  

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
```
6. 更換Google表單ID
7. 更換Line Notify 權杖
8. 若Line Notify 權杖，指定群組非個人，請把「LineNotify」加入該群組
9. 設定「現有專案的啟動程序」
![](https://i.imgur.com/f5va5Gz.png)

![](https://i.imgur.com/BVnPiOZ.png)

![](https://i.imgur.com/w7fDZ5l.png)

10.權限設定
![](https://i.imgur.com/tHZdujR.png)

![](https://i.imgur.com/2711XAs.png)

![](https://i.imgur.com/9su384a.png)

![](https://i.imgur.com/Nuud858.png)

![](https://i.imgur.com/6ZhanKQ.png)

10. 儲存，測試
[試算表結果](https://docs.google.com/spreadsheets/d/10q0FMBBNphYy3ISl5YzNi6vEkYW3NpEemUpfDSCX2JU/edit?usp=sharing)

備註：
---
從表單的響應存儲中刪除所有提交的響應。此方法不會刪除存儲在外部響應目標（如電子表格）中的響應副本，但會清除表單的摘要視圖
![](https://i.imgur.com/phnbVUW.png)
![](https://i.imgur.com/RdUxRdJ.png)

Google App Script (寫入日曆)
---
1. 日曆函數
```javascript=
createAllDayEvent(title, startDate, endDate, options)
```
日曆整日事件(標題,開始日期,結束日期,參數)


| 名稱 | 類型 | 描述 |
| -------- | -------- | -------- |
| title     |String     | 活動的標題     |
| startDate     |Date     | 事件開始的日期（僅使用日期；時間被忽略）     |
|endDate|Date|事件結束的日期（僅使用日期；時間被忽略）|
|options|Object|指定高級參數的JavaScript對象，如下所示|
		
		
進階參數
| 名稱 | 類型 | 描述 |
| -------- | -------- | -------- |
description	|String	|事件的描述|
location	|String	|活動地點|
guests	|String	|以逗號分隔的電子郵件地址列表，應將其添加為來賓
sendInvites	|Boolean	|是否發送邀請電子郵件（默認：false）|		
		
		
2. 完整程式碼
```javascript=
function getFormResponse() {  
  //由表單-Id-開啟表單
  var form = FormApp.openById("表單-Id");
  
  //取得表單名稱
  var formTitle = form.getTitle();
  
  //取得表單回覆內容
  var formResponse = form.getResponses();   
  
  //處理表單上問答內容
  for(var i = 0; i < formResponse.length ; i++){
    
    //取得表單上的項目
    var itemResponses = formResponse[i].getItemResponses();
    
    //取得表單上「收集電子郵件地址」
    var itemRespondentEmail = formResponse[i].getRespondentEmail();
    //Logger.log(itemRespondentEmail);
    
    //傳送訊息設定
    var itemContext = formTitle + "\n 填報者電子郵件 : " + itemRespondentEmail + "\n";        
      
    //----傳給日曆變數----
    var calendar = [];
    
    //將表單每一項問答組成訊息
    for(var j = 0; j < itemResponses.length ; j++)
    {  
      //----日曆----
      var v = itemResponses[j].getItem().getTitle();
      calendar[v] = itemResponses[j].getResponse();      
      //----日曆end----
      
      //取得問題標題
      itemContext += itemResponses[j].getItem().getTitle();    
      
      //取得問題回覆內容
      itemContext += " : " + itemResponses[j].getResponse() + "\n";
    }    
    
    //取得填寫表單時間
    itemContext += "\n填寫時間 : " + formResponse[i].getTimestamp() + "\n\n";
    
    //送出表單到Line
    sendToLine(itemContext);    
    
    //----寫入日曆----
    setCalendar(calendar);
    
  }
  
  //刪除回應問題
  form.deleteAllResponses();
}

function sendToLine(message){
  //填入Line-Notify-權杖
  var token = "Line-Notify-權杖";
  
  var options =
  {
      method  : "post",
      payload : "message=" + message,
      headers : {"Authorization" : "Bearer "+ token},
      muteHttpExceptions : true
  };  

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}


function setCalendar(calendar) {
  Logger.log(calendar);
  
  //日曆ID
  var calId = "日曆ID";    
  
  //設定新增的行程標題
  var title = calendar['房間編號'] + " - " + calendar['客戶姓名'];
   
  //開始日期
  var startDate = calendar['入住日期'];
  startDate = new Date(startDate.replace(/-/g, "/"));//轉換日期格式 
  
  //結束日期(必需多一天)
  var endDate = calendar['退房日期'];
  endDate = new Date(endDate.replace(/-/g, "/"));//轉換日期格式   
  //endDate=endDate.setDate(endDate.getDate()+1);//假如沒有結束日期
  endDate=new Date(endDate);
  
  var description = "房間編號: " + calendar['房間編號'] + "\n";
  description += "客戶姓名: " + calendar['客戶姓名'] + "\n";  
  description += "客戶電話: " + calendar['客戶電話'] + "\n";    
  description += "停車券: " + calendar['停車券'] + "\n";   
  description += "訂金: " + calendar['訂金'] + "\n";
  description += "尾款: " + calendar['尾款'] + "\n";
  description += "經手人員: " + calendar['經手人員'] + "\n";
  
  //顏色
  var color = 11;
  if(calendar['房間編號'] == "601"){
    var color = 1;
  }
  if(calendar['房間編號'] == "602"){
    var color = 2;
  }
  if(calendar['房間編號'] == "603"){
    var color = 3;
  }
  
  //----------------------//
  
  //透過ID取得日曆
  var cal = CalendarApp.getCalendarById(calId);
  
  //建立新的日曆行程
  var even = cal.createAllDayEvent(title, startDate, endDate, {description:description});
  
  //沒有結束日期的全天事件
  //var even = cal.createAllDayEvent(title, startDate, {description:description});

  //設定形成顏色
  even.setColor(color);
  
  //取得形成的ID
  //Logger.log(even.getId());
}

```

繳費通知
---
表單：https://docs.google.com/forms/d/1lhOoaKltMIiowq6f-MFl2JutVYjx7goSWqjnTfcH6Bw/edit?usp=sharing
```javascript=
function getFormResponse() {  
  //由表單-Id-開啟表單
  var form = FormApp.openById("Google表單-Id");
  
  //取得表單名稱
  var formTitle = form.getTitle();
  
  //取得表單回覆內容
  var formResponse = form.getResponses();   
  
  //處理表單上問答內容
  for(var i = 0; i < formResponse.length ; i++){
    
    //取得表單上的項目
    var itemResponses = formResponse[i].getItemResponses();
    
    //取得表單上「收集電子郵件地址」
    var itemRespondentEmail = formResponse[i].getRespondentEmail();
    //Logger.log(itemRespondentEmail);
    
    //傳送訊息設定
    var itemContext = formTitle + "\n 填報者電子郵件 : " + itemRespondentEmail + "\n";        
      
    //----傳給日曆變數----
    var calendar = [];
    
    //將表單每一項問答組成訊息
    for(var j = 0; j < itemResponses.length ; j++)
    {  
      //----日曆----
      var v = itemResponses[j].getItem().getTitle();
      calendar[v] = itemResponses[j].getResponse();      
      //----日曆end----
      
      //取得問題標題
      itemContext += itemResponses[j].getItem().getTitle();    
      
      //取得問題回覆內容
      itemContext += " : " + itemResponses[j].getResponse() + "\n";
    }    
    
    //取得填寫表單時間
    itemContext += "\n填寫時間 : " + formResponse[i].getTimestamp() + "\n\n";
    
    //送出表單到Line
    sendToLine(itemContext);    
    
    //----寫入日曆----
    setCalendar(calendar);
    
  }
  
  //刪除回應問題
  form.deleteAllResponses();
}

function sendToLine(message){
  //填入Line-Notify-權杖
  var token = "Line-Notify-權杖";
  
  var options =
  {
      method  : "post",
      payload : "message=" + message,
      headers : {"Authorization" : "Bearer "+ token},
      muteHttpExceptions : true
  };  

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}


function setCalendar(calendar) {
  Logger.log(calendar);
  
  //日曆ID
  var calId = "Google日曆ID";    
  
  //設定新增的行程標題
  var title = calendar['繳費單位'] + calendar['其他'] + " - " + calendar['繳費金額'];
   
  //開始日期
  var startDate = calendar['繳費日期'];
  startDate = new Date(startDate.replace(/-/g, "/"));//轉換日期格式 
  
  //結束日期(必需多一天)
  var endDate = calendar['繳費日期'];
  endDate = new Date(endDate.replace(/-/g, "/"));//轉換日期格式
   
  endDate=endDate.setDate(endDate.getDate()+1);//假如沒有結束日期 
  endDate=new Date(endDate);
  
  //Logger.log(endDate);
  
  var description = "繳費單位: " + calendar['繳費單位'] + "\n";
  description += "其他: " + calendar['其他'] + "\n";  
  description += "繳費金額: " + calendar['繳費金額'] + "\n";    
  description += "備註: " + calendar['備註'] + "\n"; 
  
  //顏色
  var color = 11;
  //  if(calendar['房間編號'] == "601"){
  //    var color = 1;
  //  }
  //  if(calendar['房間編號'] == "602"){
  //    var color = 2;
  //  }
  //  if(calendar['房間編號'] == "603"){
  //    var color = 3;
  //  }
  //  
  //----------------------//
  
  //透過ID取得日曆
  var cal = CalendarApp.getCalendarById(calId);
  
  //建立新的日曆行程
  var even = cal.createAllDayEvent(title, startDate, endDate, {description:description});
  
  //沒有結束日期的全天事件
  //var even = cal.createAllDayEvent(title, startDate, {description:description});

  //設定形成顏色
  even.setColor(color);
  
  //取得形成的ID
  //Logger.log(even.getId());
}


```


訂便當流程
---
1. [請先建立一個Google表單](https://docs.google.com/forms/d/1QO3oty_S3mHqNybWsjjlgofN5DSuHdSdHKrlaqt9ysY/edit?usp=sharing)

2. 設定「收集電子郵件地址」與「作答回條」
3. 執行「更多選項/指令碼編輯器」
```javascript=
function FormResponse(){
  // Open a form by ID and log the responses to each question.
  var form = FormApp.openById('表單-ID');
  var formResponses = form.getResponses();//得到所有回應
  
  //---- 所有回應
  for (var i = 0; i < formResponses.length; i++) {
    var formResponse = formResponses[i];//每一筆回應
    var itemResponses = formResponse.getItemResponses();//回應內容
    var formResponseTime = formResponse.getTimestamp();//時間戳記    
    var formRespondentEmail = formResponse.getRespondentEmail();//取得表單上「電子郵件地址」
      
    //----日曆變數----
    var calendar = {};
    calendar["時間戳記"] = formResponseTime;//表單回應時間    
    calendar['電子郵件地址'] = formRespondentEmail;//電子郵件地址
    
    //----取得單筆回應資料
    for (var j = 0; j < itemResponses.length; j++) {
      var itemResponse = itemResponses[j];
      
      var title = itemResponse.getItem().getTitle();//問題名稱
      var value = itemResponse.getResponse();//填報內容
      calendar[title] = value;

    }
    //----單筆回應資料end
    
    //----單筆要做的事情     
        
    //----寫入試算表(作帳用)
    appendRow(calendar);
    //----單筆要做的事情
    
    
  }
  
  //刪除回應問題
  form.deleteAllResponses();
}

function appendRow(calendar){
  //用id取得試算表
  var ss = SpreadsheetApp.openById('EXCEL-ID');
  //設定工作表 0 1 2 ....
  var Sheet = ss.getSheets()[1];//第1個工作表
  
  //插入第2行空白
  var row = 2;
  Sheet.insertRowBefore(row);
  //				
  
  //寫入記錄
  var NewArray = new Array();
  var NewArray = calendar['便當種類'].split("-");
  calendar['電話'] = calendar['電話'].toString();
  
  var data = [calendar['時間戳記'],calendar['電子郵件地址'],calendar['姓名'],calendar['電話'],NewArray[0],NewArray[1]];
  //var data = ["2019/11/23 上午 9:22:19","tawan158@gmail.com","俊良郭","0921560421","魚排便當-80"];
  data.forEach(function(item,index){
    Sheet.getRange(row, index+1).setValue(item);
  });
}


```


取得物件回圈
---
```javascript=
var obj = {};
obj["時間戳記"] = "2019/11/23 上午 8:00:40";
obj["姓名"] = "XXX";
obj["電話"] = "XXXX";

for (var k in obj){
    console.log("Key is " + k + ", value is" + obj[k]);
}
```

Google App Script Excel
---

| 函數 |  描述 |
| --------  | -------- |
| SpreadsheetApp.openById('Id') | 用id取得試算表 |
| getSheetByName(sheetName)     | 用工作表名稱設定工作表 |
| getSheets()[0]                | 用工作表序設定工作表 |
| insertRowBefore(2)            | 在第2列插入空白列 |
| getRange(2, 1)                | 得到第2列第1欄的儲存格 |
| setValue(值)                  | 把值寫入儲存格 |
| getValues()                   | 取得儲存格的值 |

取得Google Excel 並設定工作表
---
```javascript=
  var googleExcelID = "ID";
  //用id取得試算表
  var ss = SpreadsheetApp.openById(googleExcelID);
  //用工作表序 設定工作表 0 1 2 ....
  var Sheet = ss.getSheets()[0];//第1個工作表


  var googleExcelID = "ID";
  var sheetName = '工作表1'  
  //用id取得試算表
  var ss = SpreadsheetApp.openById(googleExcelID);  
  //用工作表名稱設定工作表
  var Sheet = ss.getSheetByName(sheetName);
```

得到儲存格 並設定其值
---
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow,-column
```

  //插入第2行空白
  var row = 2;
  Sheet.insertRowBefore(row);
  //				
  
  //寫入記錄
  //data[calendar['時間戳記'],calendar['電子郵件地址'],calendar['姓名'],calendar['電話'],calendar['便當種類']];
  var data = ["2019/11/23 上午 9:22:19","xxxx@gmail.com","郭xxx","0921xxxxxx","魚排便當-80"];
  data.forEach(function(item,index){
    Sheet.getRange(row, index+1).setValue(item);
  });
```

將資料寫入儲存格
---
1. 建立一個Googel Excel
2. 第1列標題：時間戳記 電子郵件地址 姓名 電話 便當種類
3. 設定A欄為日期時間格式，設定D欄為文字格式
4. 「工具/指令碼編輯器」
![](https://i.imgur.com/uMGgg7r.jpg)

5. 設定指令碼檔名
![](https://i.imgur.com/lywMl2B.jpg)

6. 設定檔案 時區

![](https://i.imgur.com/c7I7WVQ.jpg)

![](https://i.imgur.com/t0fUhFw.jpg)


7. 將程式碼貼上，將試算表ID替換，並執行
```
  var googleExcelID = "ID";
  var sheetName = '工作表1'  
  //用id取得試算表
  var ss = SpreadsheetApp.openById(googleExcelID);  
  //用工作表名稱設定工作表
  var Sheet = ss.getSheetByName(sheetName);
  
  //插入第2行空白
  var row = 2;
  Sheet.insertRowBefore(row);
  //				
  
  //寫入記錄
  //data[calendar['時間戳記'],calendar['電子郵件地址'],calendar['姓名'],calendar['電話'],calendar['便當種類']];
  
  var x0 = "2019/11/23 上午 9:22:19";
  var x1 = "xxxxx@gmail.com";
  var x2 = "路人甲";
  var x3 = "0921123456";
  var x4 = "魚排便當-80";
  
  Sheet.getRange(row, 1).setValue(x0);//寫入A欄
  Sheet.getRange(row, 2).setValue(x1);//寫入B欄
  Sheet.getRange(row, 3).setValue(x2);//寫入C欄
  Sheet.getRange(row, 4).setValue(x3);//寫入D欄
  Sheet.getRange(row, 5).setValue(x4);//寫入E欄
```
![](https://i.imgur.com/oomUrUD.jpg)

8. 核對權限
![](https://i.imgur.com/x789Bqc.jpg)

9. 選擇gmail
![](https://i.imgur.com/bJyoTPb.jpg)

10. 選擇進階
![](https://i.imgur.com/lhHxj47.jpg)

11. 選擇「前往....」
![](https://i.imgur.com/TKIZCD8.jpg)

12. 允許
![](https://i.imgur.com/Lpmf8bn.jpg)

13. 將變數 改用 陣列
```javascript= 
  //  var x0 = "2019/11/23 上午 9:22:19";
  //  var x1 = "xxxxx@gmail.com";
  //  var x2 = "路人甲";
  //  var x3 = "0921123456";
  //  var x4 = "魚排便當-80";
  var x = [];
  x[0] = "2019/11/23 上午 9:22:19";
  x[1] = "xxxxx@gmail.com";
  x[2] = "路人甲";
  x[3] = "0921123456";
  x[4] = "魚排便當-80";
  
  Sheet.getRange(row, 1).setValue(x[0]);//寫入A欄
  Sheet.getRange(row, 2).setValue(x[1]);//寫入B欄
  Sheet.getRange(row, 3).setValue(x[2]);//寫入C欄
  Sheet.getRange(row, 4).setValue(x[3]);//寫入D欄
  Sheet.getRange(row, 5).setValue(x[4]);//寫入E欄
```
14. 寫入儲存格，改用迴圈
```javascript= 
  //  var x0 = "2019/11/23 上午 9:22:19";
  //  var x1 = "xxxxx@gmail.com";
  //  var x2 = "路人甲";
  //  var x3 = "0921123456";
  //  var x4 = "魚排便當-80";
  var x = [];
  x[0] = "2019/11/23 上午 9:22:19";
  x[1] = "xxxxx@gmail.com";
  x[2] = "路人甲";
  x[3] = "0921123456";
  x[4] = "魚排便當-80";
  
  //x = ["2019/11/23 上午 9:22:19","xxxxx@gmail.com","路人甲","0921123456","魚排便當-80"]
  
  //  Sheet.getRange(row, 1).setValue(x[0]);//寫入A欄
  //  Sheet.getRange(row, 2).setValue(x[1]);//寫入B欄
  //  Sheet.getRange(row, 3).setValue(x[2]);//寫入C欄
  //  Sheet.getRange(row, 4).setValue(x[3]);//寫入D欄
  //  Sheet.getRange(row, 5).setValue(x[4]);//寫入E欄
  
  x.forEach(function(item,index){
    Sheet.getRange(row, index+1).setValue(item);
  });
```
15. 


寫入Google Excel 的函數
---
```javascript=
function appendRow(calendar){
  //用id取得試算表
  var googleExcelID = "ID";
  var sheetName = '作帳用'
  
  var ss = SpreadsheetApp.openById(googleExcelID);  
  //用工作表名稱設定工作表
  var Sheet = ss.getSheetByName(sheetName);
  //設定工作表 0 1 2 ....
  //var Sheet = ss.getSheets()[0];//第1個工作表
  
  //插入第2行空白
  var row = 2;
  Sheet.insertRowBefore(row);
  //				
  
  //寫入記錄
  //data[calendar['時間戳記'],calendar['電子郵件地址'],calendar['姓名'],calendar['電話'],calendar['便當種類']];
  var data = ["2019/11/23 上午 9:22:19","tawan158@gmail.com","俊良郭","0921560421","魚排便當-80"];
  data.forEach(function(item,index){
    Sheet.getRange(row, index+1).setValue(item);
  });
}
```

APP程式位置
---
1. [Google 表單](http://forms.google.com/)
2. [Google 試算表](http://sheets.google.com/)
3. [Google 文件](http://docs.google.com/)
4. [Google 日曆](https://calendar.google.com/)
5. [Google App Script](https://script.google.com/)
6. [Line Notify](https://notify-bot.line.me/zh_TW/)

