Title1

Title2

Title3

8. 建立共用函式

渲染畫面函式

  1. 分析
  2. 函式名稱:render(file, argsObject, title='')
  3. 主樣版:必須傳 title
  4. 子樣版:title='' 或不傳
  5. 函式
    /*========================================
      渲染網頁
    =========================================*/
    function render(file, argsObject, title='') {
      let tmp = HtmlService.createTemplateFromFile(file);
      for(let i in argsObject){
        tmp[i] = argsObject[i];
      }
      if(title){//主樣版
        return tmp.evaluate().setTitle(title).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL).addMetaTag('viewport', 'width=device-width, initial-scale=1');
      }else{//子樣版
        return tmp.evaluate().getContent();
      }  
    }

     

  6. 調用
    
    function doGet(e){
      let title = '育將電腦';
      let menu = render('menu',{title: title});
    
      return render('index',{menu: menu}, title);
    }

     

 

客戶管理 custom.gs

將「程式碼.gs」有關「custom」的函式,通通搬到「prog_custom.gs」

/*========================================
  取得結構
=========================================*/
function get_stru_custom() {
  let stru = [
    { "title": "流水號", "type": "" },
    { "title": "客戶名稱", "type": "文字" },
    { "title": "客戶電話", "type": "文字" },
    { "title": "客戶地址", "type": "文字" },
    { "title": "備註", "type": "文字" }
  ];
  return stru;
}

/*========================================
取得標題列 
=========================================*/
function get_head_custom() {
  let ss = SpreadsheetApp.getActiveSpreadsheet()
  let ws = ss.getSheetByName('day2');
  let headData = ws.getSheetValues(1, 1, 1, ws.getLastColumn())[0];
  console.log(headData);
  return headData;
}

/*========================================
取得資料 
=========================================*/
function get_data_custom() {
  let ss = SpreadsheetApp.getActiveSpreadsheet()
  let ws = ss.getSheetByName('day2');
  if (ws.getLastRow() < 2) return [];//無資料
  let data_custom = ws.getSheetValues(2, 1, ws.getLastRow() - 1, ws.getLastColumn());
  console.log(data_custom[0]);
  return data_custom;
}


/*=====================================
  設定標題 
=====================================*/
function set_head_custom() {
  let stru = get_stru_custom();
  let sheet = 'day2';
  let rowIndex = 1;
  for (let i in stru) {
    let colIndex = Number(i) + 1;
    setCellData(sheet, rowIndex, colIndex, stru[i]['title']);
  }
}

/*========================================
  設定客戶資料 
=========================================*/
function set_data_custom() {
  let customData = [1, '育將電腦', '0123456789', '台南市永康區大灣路158號', '備註1'];
  let sheet = 'day2';
  let rowIndex = 2;
  for (let i in customData) {
    let colIndex = Number(i) + 1;
    setCellData(sheet, rowIndex, colIndex, customData[i]);
  }

  customData = [2, 'Google', '1234567890', '美國', '備註2'];
  rowIndex = 3;
  for (let i in customData) {
    let colIndex = Number(i) + 1;
    setCellData(sheet, rowIndex, colIndex, customData[i]);
  }
}

 

指令碼屬性

在GAS除了用試算表來儲存資料,還有指令碼屬性,可以儲存。

Google Apps Script(GAS)中的指令碼屬性(Script Properties)用於存儲與腳本項目相關的全局配置設置或需要在腳本執行之間保留的數據。

  1. 取得指令碼屬性服務:通常是全域變數,故請將此方法放在函式外面,讓其在任何地方皆可使用
    var SCRIPT_PROP = PropertiesService.getScriptProperties();

     

  2. 設定
    setProperty(屬性,值)

     

  3. 取得
    getProperty(屬性)

Session

  1. Session.getActiveUser().getEmail():取得當前用戶的電子郵件,不過我們若部署為「網站應用程式」且權授是所有人,它僅能取部署人的email

  2. 通過第1項,於我們可以將「管理員」email儲存於「指令碼屬性」,並判斷 Session.getActiveUser().getEmail() 是否與指令碼屬性 相等,若是則是管理員

  3. 建立 setup(),並讓管理員在建立副本後,直接執行它
     

    
    /*=====================================
     安裝程式
    =====================================*/
    function setup() {
      //管理員email  
      SCRIPT_PROP.setProperty("adminEmail", Session.getActiveUser().getEmail());
    }

     

  4. 判斷是否為管理員
     

    
      // 權限  
      let isAdmin = SCRIPT_PROP.getProperty("adminEmail") === Session.getActiveUser().getEmail() ? true : false;

     

  5. 在將isAdmin 傳至樣版判斷,是否出現管理員選單