Title1
Title2
Title3
Login
Link
Search
教學頻道
中信金融管理學院
點二下資訊社
新化社區大學
GAS+購物車開發
GAS專案
GAS+購物車開發
Google表單實戰電商購物車
GAS+LineBot開發
外帶內用管理
購物車管理
線上打卡系統管理
萬用表單5
LineBot 線上書籍
PHP專案
網站程式設計-PHP(10502)
網站程式設計-PHP
PHP SMARTY 樣板引擎
SMARTY樣板
課程教材
雲端工具入門
行動應用企劃人員養成班
萬用表單5
GAS+LineBot開發
研習
萬用表單5
鐵人賽-Google Apps Script整合運用
GAS+LineBot開發
樂齡3C學習不斷電
臺東專科學校
GAS 開發 LineBot 自動接單系統
德鍵
112行動應用企劃人員養成班
111網頁前端設計工程師培訓班
110網頁前端設計工程師培訓班
網頁前端設計工程師培訓班
old
網頁前端設計與開發運用培訓班
Javascript & JQUERY
免費釋出專案
萬用表單
自動資料查詢
台南社大
113-01-雲端工具入門
112-02-AI自動管理
112-01-用QRCODE打造自動化環境
110-01-用雲端打造自動化環境
用雲端打造自動化環境
Google雲端智慧王
讓雲端工具提昇工作效率
Google 速學工作術
台南市總圖
教你如何使用LINE Bot機器人增加工作效率
Google雲端工具基礎應用
Google雲端工具進階應用
工作自動化與行銷(台南社大)
全部教材
台南市人力發展中心
Google工具應用實務班
企業課程
鐳達實業有限公司
GAS研習-20200726
中正大學-GAS研習
將軍圖書館
Google雲端工具基礎應用
Google雲端工具進階應用
南方創客
GitHub 衍伸應用
Google 應用工作術
永康社大
用雲端打造自動化環境(110-春季班)
用雲端打造自動化環境
南關社大
電腦、手機生活應用
遠端桌面
公司業務
傳送檔案
adwcleaner
W10 更新
客戶網站
最近完工
深雋設計有限公司
新化社大校務系統
靚品科技有限公司
5C Precision Co., Ltd.
BALANCE 1
RWD網站
東北關廟麵
曼馱有限公司
永宸昕有限公司
昌美實業社
形象網站
勇信機械有限公司
GAS專案
聯絡我們&案件委託
所有書籍
「用QRCODE打造自動化環境」目錄
MarkDown
4. 實做QRCODE報修管理
1. Line Bot申請&設定
1-1 安裝專案(需授權)
1-2 部署為網站應用程式
1-3 Line Bot申請
1-4 Line Bot 設定
1-5 LineBot測試
2. 萬用表單安裝&設定
2-1 建立Google 日曆
2-1-1 日曆顏色
2-2 Line Notify
3. Line Bot 自動回應設定
3-1 學員專案1 - 排班表
4. 實做QRCODE報修管理
4-1 v1.5 升級至 v1.6
4-2 教室預約
5. 部署自動回覆機器人
6. 整合工具實做自己需要的自動流程
4-2 教室預約
用QRCODE打造自動化環境 ============== ### 一、修改內容 1.
修正管理員權限錯誤
2.
prog\_global.gs
### 二、升級方式 1.
重新建立副本:如此部署網址會變動,LineBot、表單都需重建
2.
手動升級:將下列程式碼複製,至目前版本,覆蓋
3.
記得重新部署(
選建立新版本
)
![](https://i.imgur.com/9aUkqSA.png) 4.
prog\_global.gs
```javascript /*============================================ 得到 全域變數 結構 ============================================*/ function get_stru_global(){ let stru = [ { title: '網站標題', name: 'web_title', sort: 1, kind: '簡答', type: '文字', option: '', validate: '必填', form_width: 8, default: 'XXX', readme: '', fun: '', list_show: '', list_sort: '', list_align: '', list_width: '' }, { title: '螢幕寬度', name: 'width', sort: 2, kind: '下拉選單', type: '文字', option: 'container,container-fluid', validate: '', form_width: 2, default: 'container', readme: '', fun: '', list_show: '', list_sort: '', list_align: '', list_width: '' }, { title: '記錄LineBot', name: 'record_line_bot', sort: 9, kind: '下拉選單', type: '文字', option: ',是', validate: '', form_width: 2, default: '', readme: '', fun: '', list_show: '', list_sort: '', list_align: '', list_width: '' }, { title: 'CHANNEL_ACCESS_TOKEN', name: 'CHANNEL_ACCESS_TOKEN', sort: 3, kind: '段落', type: '文字', option: '', validate: '', form_width: 12, default: '', readme: '', fun: '', list_show: '', list_sort: '', list_align: '', list_width: '' }, { title: '首頁內容', name: 'index_content', sort: 25, kind: '網頁編輯器', type: '文字', option: '', validate: '', form_width: 12, default: '', readme: '', fun: '', list_show: '', list_sort: '', list_align: '', list_width: '' }]; //console.log(stru); return stru; } /*============================================ 建立 全域變數 create_global(); ============================================*/ function create_global(sheet="全域變數"){ let ws = Sheet.getWs(sheet); let rowIndex,global; let stru = get_stru_global(); if(ws === null){ //建立工作表 Sheet.createSheet(sheet); //取得工作表 ws = Sheet.getWs(sheet); for(let i in stru){ rowIndex = parseInt(i) + 1; Sheet.setCellData(sheet,rowIndex,1,stru[i]['title'],'文字'); Sheet.setCellData(sheet,rowIndex,2,stru[i]['default'],stru[i]['type']); } }else{ global = get_global(); for(let i in stru){ rowIndex = parseInt(i) + 1; if(global[stru[i]['title']] === null){ Sheet.setCellData(sheet,rowIndex,1,stru[i]['title'],'文字'); Sheet.setCellData(sheet,rowIndex,2,stru[i]['default'],stru[i]['type'][i]); }else{ Sheet.setCellData(sheet,rowIndex,1,stru[i]['title'],'文字'); Sheet.setCellData(sheet,rowIndex,2,global[stru[i]['title']],stru[i]['type'][i]); } } } } /*====================================== 取得全域變數 ======================================*/ function get_global(){ let stru = get_stru_global(); let global = {}; let rowIndex,range; let ws = Sheet.getWs('全域變數'); for(let i in stru){ rowIndex = parseInt(i) + 1; range_title = ws.getRange(rowIndex, 1); range = ws.getRange(rowIndex, 2); if(range_title.getValue()){ global[stru[i]['title']] = range.getValue(); }else{ global[stru[i]['title']] = null; } } global['網站標題'] = global['網站標題'] ? global['網站標題'] : '請設立網站標題'; global['url'] = ScriptApp.getService().getUrl();//取得網頁應用程式網址 let isAdmin = JSON.parse(SCRIPT_PROP.getProperty("adminEmail")); global['adminEmail'] = isAdmin[0];//Session.getActiveUser().getEmail(); global['userEmail'] = Session.getActiveUser().getEmail(); global['isAdmin'] = isAdmin.indexOf(global['userEmail']) != -1 ? true : false;// global['emailQuota'] = MailApp.getRemainingDailyQuota(); global['CHANNEL_ACCESS_TOKEN'] = global['CHANNEL_ACCESS_TOKEN'] ? global['CHANNEL_ACCESS_TOKEN'].trim() : ''; if(SCRIPT_PROP.getProperty("LINE") === null){ global['LINE'] = { userId:'', //機器人的用戶 ID basicId:'', //機器人的基本ID displayName:'', //機器人的顯示名稱 pictureUrl:'', //個人資料圖片網址 chatMode:'', //聊天模式 chat:響應模式設置為“聊天”。 bot:響應模式設置為“Bot”。 markAsReadMode:'' //標記為已讀模式 auto:啟用自動讀取設置。 manual:禁用自動讀取設置。 }; }else{ global['LINE'] = JSON.parse(SCRIPT_PROP.getProperty("LINE")); } //global['LINE'] = JSON.parse(SCRIPT_PROP.getProperty("LINE")); //console.log(global['LINE']); global['op'] = ''; return global; } /*============================================ 得到 全域變數 資料 ============================================*/ function get_row_global(sheet="全域變數"){ let ws = Sheet.getWs(sheet); let range = ws.getRange(1, 2, ws.getLastRow()); let row = range.getValues().map(function(r){ return r[0]; }); return row; } /* ========================== 全域變數 表單函式 ============================*/ function form_global(e) { //-------------------------------------------- 取得 global結構 let stru = get_stru_global();//取得 全域變數 結構 let row = get_row_global();//取得 全域變數 資料 //-------------------------------------------- 取得必填欄位,過濾「required」有值 var validate = stru.filter(function(r){ return r['validate'] !== ""; }); //將規則轉成文字 let rules = validate.map(function(r){ if(r['validate'] == "email"){ return "'" + r['name'] +"': { required: true, email : true}" ; } else{ return "'" + r['name'] +"': { required: true }" ; } }).join(","); //將訊息轉成文字 let messages = validate.map(function(r){ if(r['validate'] == "email"){ return "'" + r['name'] +"': { required: '必填', email : 'email格式不正確'}" ; } else{ return "'" + r['name'] +"': { required: '必填' }" ; } }).join(","); global['formTitle'] = '全域變數'; //-------------------------------------------- 表單 let content = Sheet.render("form_global", {global: global, stru: stru, row: row, rules: rules, messages: messages}); //-------------------------------------------- 渲染網頁 return Sheet.render('index', {global: global, menu: menu, content: content}, global['formTitle']); } /* ========================== 寫入試算表 ============================*/ function insert_global(formData){ //-------------------------------------------------------- 取得全域變數 let global = get_global();//取得全域變數 let sheet = "全域變數"; //--------------------------------------------- 設定工作表 let ws = Sheet.getWs(sheet); //檢查 接收工作表 if(ws == null){ //檢查 全域變數 create_global(); ws = Sheet.getWs(sheet); } //-------------------------------------------------------- 取得限制條件 //-------------------------------------------------------- 取得 全域變數 let stru = get_stru_global(); //-------------------------------------------------------- 寫入資料 let rowIndex; for(let i in stru){ rowIndex = parseInt(i) + 1; Sheet.setCellData(sheet, rowIndex, 2, formData[stru[i]['name']], stru[i]['type']); } //----------------------------------------將「CHANNEL_ACCESS_TOKEN」寫入 指令碼屬性 SCRIPT_PROP.setProperty("CHANNEL_ACCESS_TOKEN", formData['CHANNEL_ACCESS_TOKEN']); //----------------------------------------將「LineBot Info」寫入 指令碼屬性 SCRIPT_PROP.setProperty("LINE", JSON.stringify(getLineUserInfo(formData['CHANNEL_ACCESS_TOKEN']))); //-------------------------------------取得全域變數 global = get_global(); //-------------------------------------menu子樣板 menu = Sheet.render('menu', {global: global}); let button = Sheet.render("button", {bg: 'btn-success',title: '全域變數', url: global.url+'?op=form_global',target:'' }); return Sheet.render('show_message', {global: global, title: '全域變數 資料寫入成功', message: button, bg: 'bg-primary'}); } ```