Title1

Title2

Title3

11-4 顯示工作表資料

程式碼.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>