雲端工具入門
	程式碼.gs
/*=====================================
  Get
=====================================*/
function doGet(e) {
  console.log(e);
  let file = "index";
  let title = "訂便當";
  let argsObject = {
    title: title
  };
  return render(file, argsObject, title);
}
/*======================================
  渲染網頁
  file:樣版檔案
  argsObject:物件參數
  title:有值為主樣版,無值為子樣版
======================================*/
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();
  }
}
/*======================================
  請按照工作表欄位順序 設定
======================================*/
function get_stru() {
  let stru = [
    {
      title: '時間戳記',     //欄名
      visible: true,        //是否顯示 true|false
      align: '',            //對齊 left|center|right
      sortable: true,       //是否排序 true|false
      width: 200            //寬度(px)
    },
    {
      title: '姓名',
      visible: true,
      align: '',
      sortable: true,
      width: ''
    },
    {
      title: '餐點',
      visible: true,
      align: '',
      sortable: true,
      width: ''
    },
    {
      title: '單價',
      visible: true,
      align: 'right',
      sortable: true,
      width: ''
    },
    {
      title: '套餐 +25元',
      visible: true,
      align: 'center',
      sortable: true,
      width: ''
    },
    {
      title: '糖',
      visible: true,
      align: 'center',
      sortable: true,
      width: ''
    },
    {
      title: '冰',
      visible: true,
      align: 'center',
      sortable: true,
      width: ''
    },
    {
      title: '小計',
      visible: true,
      align: 'right',
      sortable: true,
      width: '80'
    }
  ]
  return stru;
}
/*======================================
  請自行更換 工作表 名稱
======================================*/
function getData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  // 請自行更換 工作表 名稱
  let ws = ss.getSheetByName("表單回應 1");
  let dataArray = {};
  let stru = get_stru();
  let data = ws.getRange(2, 1, ws.getLastRow() - 1, ws.getLastColumn()).getValues();
  // 日期格式化 + 個資顯示
  data.forEach((item, index) => {
    data[index][0] = Utilities.formatDate(item[0], "GMT+08:00", "yyyy/MM/dd HH:mm:ss");//格式化日期 2020/06/13/ 23:06
    data[index][1] = deIdentification(item[1]);                                        //個資顯示
  });
  // 撈出當日的資料
  let currentDate = Utilities.formatDate(new Date(), "GMT+08:00", "yyyy/MM/dd");//格式化日期 今天的日期
  let todayData = data.filter(item => {
    let orderDate = item[0].split(' ')[0]; // 取得訂單的日期部分
    return orderDate === currentDate;
  });
  return { stru: stru, data: todayData };
}
/*============================================
  去識別化(個資顯示)
============================================*/
function deIdentification(str) {
  str = str.toString();
  const showLen = Math.round(str.length / 2); // 顯示幾個
  const markLen = str.length - showLen; // 要隱藏幾個
  const showStart = Math.round((str.length - showLen) / 2); // 從哪開始隱
  return str.replace(str.substr(showStart, markLen), '*'.repeat(markLen));
}
  新增 index.html (副檔名不用輸入) <!doctype html> <html lang="en"> <head> <base target="_top"> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- jquery https://developers.google.com/speed/libraries#jquery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script> <!-- bootstrap https://getbootstrap.com/docs/5.3/getting-started/introduction/ --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <!-- bootstrap icon https://icons.getbootstrap.com/ --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script> <!-- bootstrap-table --> <link rel="stylesheet" href="https://unpkg.com/bootstrap-table@1.22.2/dist/bootstrap-table.min.css"> <script src="https://unpkg.com/bootstrap-table@1.22.2/dist/bootstrap-table.min.js"></script> <script src="https://unpkg.com/bootstrap-table@1.22.2/dist/locale/bootstrap-table-zh-TW.js"></script> </head> <body> <div class="container mt-3"> <h1 class="text-center"><?= title ?></h1> <div id="toolbar"></div> <table id="table"></table> </div> <script> function sheetData() { google.script.run.withSuccessHandler(function(rows){ let columns = []; rows.stru.forEach((item, index) => { columns.push({ field: `${index}`, title: item['title'], visible: item['visible'], align: item['align'], sortable: item['sortable'], width: item['width'] }) }) $("#table").bootstrapTable({ classes: 'table table-sm table-bordered table-hover', //表格樣式 table table-sm table-striped table-bordered table-hover toolbar: '#toolbar', //工具按鈕用哪個容器 cache: false, //是否使用快取,預設為 true,所以一般情況下需要設定一下這個屬性(*) sidePagination: "client", //分頁方式:client 使用者端分頁,server 伺服器端分頁(*) theadClasses: 'table-dark', //標題列樣式 rememberOrder: true, //使用rememberOrder選項來記住每列的順序。 sortName: '0', //排序欄名 sortOrder: 'desc', // //可於ToolBar上顯示的按鈕 buttonsClass: "primary", // buttonsAlign: "right", //left right // showColumns : true, //顯示/隱藏哪些欄位 // showToggle : true, //名片式/table式切換 showRefresh : false, //重新整理 showPaginationSwitch : true, //分頁/不分頁切換 showFullscreen: true, //顯示全螢幕 search : true, //查詢 // buttons : '', //返回甄角按鈕 // cardView: true, //是否顯示詳細檢視 // detailView: true, //是否顯示父子表 pagination : true, //使否要分頁 pageNumber:1, //初始化載入第一頁,預設第一頁 onPageChange:function(currentPage, pageSize) { //console.log("目前頁數: "+currentPage+" ,一頁顯示: "+pageSize+" 筆"); }, pageSize : 10, //一頁顯示幾筆 pageList : "[ 10, 20, 100, all]", //一頁顯示幾筆的選項 formatRecordsPerPage:function(pageSize) { return ' 每頁顯示 ' + pageSize + ' 筆'; }, formatShowingRows:function(fromIndex, toIndex, totalSize) { //目前第幾頁 var currentPage = Math.ceil(fromIndex / this.pageSize); //總共幾頁 var totalPageCount = Math.ceil(totalSize / this.pageSize); return currentPage+' / '+totalPageCount; }, columns: columns, data: rows.data }); }).getData(); } $(function(){ sheetData(); }) </script> </body> </html>