線上書籍

Home

鐵人賽-Google Apps Script整合運用

全域變數
  1. 指令碼:prog_global.gs
  2. 函式:get_global()
  3. 將全局的變數,利用指令碼屬性儲存,但它無法儲存物件,故我們將這個物件變數轉成JSON,要撈出時再轉成物件
  4. 物件變 JSON: JSON.stringify()

     

  5. JSON 變物件: JSON.parse()

     

  6. 常用指令 // 指令碼屬性:設定 SCRIPT_PROP.setProperty(屬性,值); // 指令碼屬性:取值 SCRIPT_PROP.getProperty(屬性); // Session: 取得當前使用者email(只限部署人) Session.getActiveUser().getEmail(); // 網頁應用程式網址 ScriptApp.getService().getUrl()

     

  7. 目前需要用到的「全域變數」:isAdmin、url、webTitle
    isAdmin、url是動態資料,不需儲存
    webTitle 則是可以事先儲存,這裡先用變數,後面再來做一個界面用表單操作
     
  8. 宣告
    前台的樣版語法,可以直接調後台的函式,故 global是不用傳值進入 render(),也可以直接調用 //------------------------------------- 3. 全域變數 var global = get_global(); //------------------------------------- 4. 選單 var menu = render('menu', {});

     

  9.  取得全域變數

    /*===================================== 取得全域變數 =====================================*/ function get_global() { // 從指令碼屬性 取得 global global = SCRIPT_PROP.getProperty('global') ? JSON.parse(SCRIPT_PROP.getProperty('global')) : {}; // 管理員權限 global['isAdmin'] = SCRIPT_PROP.getProperty('adminEmail') === Session.getActiveUser().getEmail() ? true : false; // 網頁應用程式網址 global['url'] = ScriptApp.getService().getUrl(); return global; }

     

  10. 設定全域變數
     

    /*===================================== 安裝程式 =====================================*/ function setup() { //管理員email SCRIPT_PROP.setProperty("adminEmail", Session.getActiveUser().getEmail()); global = { webTitle : '育將電腦工作室' } SCRIPT_PROP.setProperty("global", JSON.stringify(global)); global = get_global(); }

     

  11. 確認 global 沒問題後,請更改樣版語法 menu.html

    <nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="<?= global.url ?>"><?= global.webTitle ?></a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav me-auto mb-2 mb-lg-0"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="<?= global.url ?>">首頁</a> </li> <? if(global.isAdmin){ ?> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 管理員 </a> <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> <li><a class="dropdown-item" href="<?= global.url ?>?op=custom">客戶管理</a></li> <li><hr class="dropdown-divider"></li> </ul> </li> <? } ?> </ul> </div> </div> </nav>

     

  12. 調整樣版 將index.html 改名 tmp.html
     

    <html> <head> <meta charset="utf-8"> <base target="_top"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- bootstrap --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script> <!-- bootstrap icon --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css"> <!-- jquery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script> </head> <body> <?!= menu ?> <div class="container"> <!-- 資料處理時畫面 --> <div class="d-none my-5" id="show"> <span>資料處理中....<img src="https://i.imgur.com/pm9SKUg.gif"></span> </div> <!-- 主畫面 --> <div id='main-content'> <?!= content ?> </div> </div> </body> </html>

     

  13. index(e)
     

    /*===================================== 首頁 =====================================*/ function index(e) { let title = '首頁'; let content = ''; content = `<h2 class='mt-3'>${title}</h2>`; return render('tmp', {content: content}, title); }

     

  14. custom(e)

    /*======================================== 客戶資料 查詢 =========================================*/ function custom(e){ let title = '客戶管理'; let content = ''; content = `<h2 class='mt-3'>${title}</h2>`; return render('tmp', {content: content}, title); }

     

 

 

權限
  1. 種類:管理員、訪客
  2. 在「建立路由與請求」單元,我們知道若要執行「客戶管理」,須透過「路由」Route.path("custom", custom),所以只將這個路由,放在 isAdmin 條件下,這樣訪客就沒有路由,也無法執行 // ----------------------------------- 管理員 路由 if(global.isAdmin){ Route.path("custom", custom); } // ----------------------------------- 管理員 路由 END