彰化一整天的論壇

 找回密碼
 立即註冊
查看: 122|回復: 9

訂單多筆查詢及更新(日期加選取表格並複製)

[複製鏈接]
發表於 2021-7-16 10:35:58 | 顯示全部樓層 |閱讀模式
本帖最後由 imingho 於 2021-7-16 10:45 編輯

有網友提到是否可以用核取方塊做多個選項更新,所以就做了這支查詢及更新的功能,功能大概說明一下,就是輸入日期區間會查出訂單,勾選想要更新的訂單輸入【訂單狀態】,再按一次就會更新,加入新增選取表格並複製。
測試查詢程式:https://sites.google.com/view/in ... 6%E8%A1%A8%E6%A0%BC
試算表網址: https://docs.google.com/spreadsh ... 2w/edit?usp=sharing

網頁程式碼:
  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <script type="text/javascript">
  5. Date.prototype.format = function(fmt)
  6. {
  7.   var o = {
  8.     "M+" : this.getMonth()+1, //月份
  9.     "d+" : this.getDate(), //日
  10.     "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小時
  11.     "H+" : this.getHours(), //小時
  12.     "m+" : this.getMinutes(), //分
  13.     "s+" : this.getSeconds(), //秒
  14.     "q+" : Math.floor((this.getMonth()+3)/3), //季度
  15.     "S" : this.getMilliseconds() //毫秒
  16.   };
  17.   if(/(y+)/.test(fmt))
  18.     fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  19.   for(var k in o)
  20.     if(new RegExp("("+ k +")").test(fmt))
  21.   fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  22.   return fmt;
  23. }

  24. var dateReviver = function (key, value) {
  25.     var a;
  26.     if (typeof value === 'string') {
  27.         a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
  28.         if (a) {
  29.             return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])).format("yyyy-MM-dd HH:mm:ss");
  30.         }
  31.     }
  32.     return value;
  33. };
  34. function inq()
  35. {
  36. var xmlhttp;

  37.         if (window.XMLHttpRequest)
  38.           {// code for IE7+, Firefox, Chrome, Opera, Safari
  39.           xmlhttp=new XMLHttpRequest();
  40.           }
  41.         else
  42.           {// code for IE6, IE5
  43.           xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  44.           }
  45.         xmlhttp.onreadystatechange=function()
  46.           {
  47.                   if (xmlhttp.readyState==4 && xmlhttp.status==200)      
  48.                   {
  49.                         var result=xmlhttp.responseText;
  50.                         var obj = JSON.parse(result,dateReviver);//解析json字串為json物件形式
  51.                                                 
  52.                         var html = '<table border=1 width=100%>';//
  53.                         
  54.                         for (var i = 0; i < obj.length; i ++ ) {//
  55.                                 html  += '<tr>';//
  56.                                                                 if(i==0)
  57.                                                                   html+="<td>編號</td>";
  58.                                                                 else
  59.                                                                   html+="<td>"+'<input type=checkbox id="OrderID" value="'+obj[i].data[0]+'">'+i+"</td>";
  60.                                 for(j=0;j<obj[i].data.length;j++)
  61.                                 {
  62.                                   html+= '<td>'+obj[i].data[j]+'</td>';
  63.                                 }
  64.                                 html  += '</tr>';            
  65.                         }
  66.                         html+="</table>";
  67.                         
  68.                         document.getElementById("order_status").innerHTML=html;
  69.                         if(obj.length==1) //只有一筆代表查不到資料
  70.                                 alert('查無資料');
  71.                   }

  72.           }
  73.     var url="https://script.google.com/macros/s/AKfycbz-7Djl13Djepmx3KPdpGqbQDSlyzdSQaAexqPWoc9hPAEtBEik8TCAHg/exec";
  74.         
  75.         var OrderID_list="";
  76.                 if (typeof(OrderID) !== 'undefined')
  77.                 {
  78.                         for (var i = 0; i < OrderID.length; i++) {
  79.                           if (OrderID[i].checked) {
  80.                                         OrderID_list += OrderID[i].value + ",";
  81.                           }
  82.                         }
  83.                         if(OrderID_list.length>0)
  84.                            OrderID_list=OrderID_list.substr(0,OrderID_list.length-1);
  85.                         if(typeof(OrderID.length)==='undefined') //單一選項
  86.                            OrderID_list=OrderID.value;               
  87.                 }
  88.                
  89.                 url+="?BeginDate="+BeginDate.value+"&EndDate="+EndDate.value+"&OrderID="+OrderID_list+"&OrderStatus="+OrderStatus.value;
  90.                 console.log(url);
  91.         xmlhttp.open("get",url,true);
  92.         xmlhttp.send();
  93. }

  94. function selectElementContents(el) {
  95.         var body = document.body, range, sel;
  96.         if (document.createRange && window.getSelection) {
  97.                 range = document.createRange();
  98.                 sel = window.getSelection();
  99.                 sel.removeAllRanges();
  100.                 try {
  101.                         range.selectNodeContents(el);
  102.                         sel.addRange(range);
  103.                 } catch (e) {
  104.                         range.selectNode(el);
  105.                         sel.addRange(range);
  106.                 }
  107.         } else if (body.createTextRange) {
  108.                 range = body.createTextRange();
  109.                 range.moveToElementText(el);
  110.                 range.select();
  111.         }
  112.         document.execCommand("copy");

  113. }
  114. </script>
  115. </head>
  116. <body>
  117. 輸入開始訂購日期:<input type="text" id="BeginDate" value="2020/02/01" /><br/>
  118. 輸入結束訂購日期:<input type="text" id="EndDate" value="2020/02/10" /><br/>

  119. 訂單狀況:<input type="text" id="OrderStatus" value="" /><br/>
  120. <input type="button" name="inq" value="查詢/更新" onclick="inq();"></br>
  121. <span id="order_status"></span>
  122. <input type="button" value="選取表格" onclick="selectElementContents( document.getElementById('order_status') );">
  123. </body>
  124. </html>

複製代碼
試算表程式:
  1. function doGet(e) {
  2.   //https://youtu.be/MQV3AlAOtCU 影音說明
  3.   var params = e.parameter;
  4.   var BeginDate = Date.parse(params.BeginDate);
  5.   var EndDate=Date.parse(params.EndDate);
  6.   var OrderID=params.OrderID;
  7.   //var OrderName=params.OrderName;
  8.   var OrderStatus=params.OrderStatus;//匯款後3碼

  9.   var OrderList=OrderID.split(",");


  10.   var Sheet = SpreadsheetApp.getActiveSheet();

  11.   var LastRow = Sheet.getLastRow();
  12.   var LastColumn = Sheet.getLastColumn();
  13.   var data = [];

  14.   // 取得全部資料
  15.   var listAll = Sheet.getSheetValues(1, 1, LastRow, LastColumn);
  16.   
  17.   //存標題
  18.   data.push({data: listAll[0]})

  19.   var ListDate;//儲存日期格式
  20.   var ListOrderID;
  21.   // 找尋資料是否有存在
  22.   for(var i = 1;i < listAll.length; i++){
  23.     ListDate=listAll[i][1];
  24.     ListDate=Date.parse(ListDate);
  25.     ListOrderID=listAll[i][0];
  26.     if(ListDate>=BeginDate && ListDate<=EndDate){
  27.       if(OrderStatus!="" && OrderList.indexOf(ListOrderID)!=-1)
  28.       {
  29.         Sheet.getRange("D"+(i+1)).setValue(OrderStatus);//寫回狀態   
  30.         Sheet.getRange("G"+(i+1)).setValue(new Date());//寫回狀態
  31.         listAll[i]=Sheet.getSheetValues(i+1,1,1,LastColumn)[0];//重新讀取
  32.       }
  33.       data.push({data: listAll[i]})
  34.     }
  35.   }
  36.   
  37.   //顯示資料
  38.   Logger.log(data);
  39.   
  40.   // 回傳json資料
  41.   return ContentService.createTextOutput(JSON.stringify(data))
  42.     .setMimeType(ContentService.MimeType.JSON);
  43. }
複製代碼





回復

使用道具 舉報

發表於 2021-7-18 14:58:23 | 顯示全部樓層
老師您好 我嘗試在 網頁程式碼中新增一格處理人員的下拉式選單 來寫回狀態
是否在url+="?BeginDate="+BeginDate.value+"&EndDate="+EndDate.value+"&OrderID="+OrderID_list+"&OrderStatus="+OrderStatus.value;
這一段 新增NAME跟值 +"&member="+member.value

試算表程式:給他定義
var member = params.member;
Sheet.getRange("x"+(i+1)).setValue(member);//寫回狀態
但是都不會更新了
這樣可能是錯在哪裡
回復 支持 反對

使用道具 舉報

 樓主| 發表於 2021-7-18 15:17:15 | 顯示全部樓層
amdamd 發表於 2021-7-18 14:58
老師您好 我嘗試在 網頁程式碼中新增一格處理人員的下拉式選單 來寫回狀態
是否在url+="?BeginDate="+Begin ...

您有直接用網址帶參數呼叫是否可以成功。
回復 支持 反對

使用道具 舉報

發表於 2021-7-18 16:30:19 | 顯示全部樓層
本帖最後由 amdamd 於 2021-7-18 16:38 編輯
imingho 發表於 2021-7-18 15:17
您有直接用網址帶參數呼叫是否可以成功。
https://script.google.com/macros/s/XXXXXXXXXXXXXXX/exec?BeginDate=2021/07/16&EndDate=2021/07/19&OrderID=undefined&OrderStatus=QQQ&member=cat


他有出現在網址列上,但就是沒有覆蓋過去

[{"data":["簽收編號","時間戳記","區域","位置","編碼","藥號","傳遞編號","處理狀態","簽收時間","處理人員"]},{"data":["2021071670070000070","2021-07-16T01:54:01.249Z","03G","011",1013254,70070,"S123",123,"2021-07-16T14:25:43.625Z",321]},{"data":["2021071670071000071","2021-07-16T02:00:52.570Z","03G","011","W12345",70071,"S123","","",""]},{"data":["2021071670072000072","2021-07-16T02:14:02.457Z","04D","011","QQQ",70072,"AAA","","",""]},{"data":["2021071670073000073","2021-07-16T07:09:51.200Z","04B","011","W123",70073,"s123","","",""]},{"data":["2021071670074000074","2021-07-16T07:12:46.900Z","04D","011","W123456",70074,"S1234","","",""]},{"data":["2021071670075000075","2021-07-16T07:14:51.281Z","03G","011","W1234",70075,"W123","","",""]},{"data":["2021071670076000076","2021-07-16T08:02:35.581Z","03G","022","W12345",70076,"W1234","","",""]},{"data":["2021071670076000077","2021-07-16T08:04:15.492Z","04B","022","W12345",70077,"W1234","","",""]},{"data":["2021071670078000078","2021-07-16T08:08:15.020Z","04B","031","R13345",70078,"G12345","","",""]}]
回復 支持 反對

使用道具 舉報

 樓主| 發表於 2021-7-18 19:51:19 | 顯示全部樓層
amdamd 發表於 2021-7-18 16:30
他有出現在網址列上,但就是沒有覆蓋過去

[{"data":["簽收編號","時間戳記","區域","位置","編碼","藥號 ...

請參考這篇貼上試算表的全部程式碼.

如何在discuz張貼程式碼

http://discuz.bestdaylong.com/thread-30239-1-1.html
回復 支持 反對

使用道具 舉報

發表於 7 天前 | 顯示全部樓層
謝謝老師
GS code

  1. function doGet(e) {
  2.   //https://youtu.be/MQV3AlAOtCU 影音說明
  3.   var params = e.parameter;
  4.   var BeginDate = Date.parse(params.BeginDate);
  5.   var EndDate=Date.parse(params.EndDate);
  6.   var OrderID=params.OrderID;
  7.   //var OrderName=params.OrderName;
  8.   var OrderStatus=params.OrderStatus;//匯款後3碼
  9.   var member=params.members;
  10.   var OrderList=OrderID.split(",");
  11.   var Sheet = SpreadsheetApp.getActiveSheet();

  12.   var LastRow = Sheet.getLastRow();
  13.   var LastColumn = Sheet.getLastColumn();
  14.   var data = [];

  15.   // 取得全部資料
  16.   var listAll = Sheet.getSheetValues(1, 1, LastRow, 10,);
  17.   
  18.   //存標題
  19.   data.push({data: listAll[0]})

  20.   var ListDate;//儲存日期格式
  21.   var ListOrderID;
  22.   // 找尋資料是否有存在
  23.   for(var i = 1;i < listAll.length; i++){
  24.     ListDate=listAll[i][1];
  25.     ListDate=Date.parse(ListDate);
  26.     ListOrderID=listAll[i][0];
  27.     if(ListDate>=BeginDate && ListDate<=EndDate){
  28.       if(OrderStatus!="" && OrderList.indexOf(ListOrderID)!=-1)
  29.       {
  30.         Sheet.getRange("H"+(i+1)).setValue(OrderStatus);//寫回狀態   
  31.         Sheet.getRange("I"+(i+1)).setValue(new Date());//寫回狀態
  32.         Sheet.getRange("J"+(i+1)).setValue(member);//寫回狀態
  33.         listAll[i]=Sheet.getSheetValues(i+1,1,1,10)[0];//重新讀取
  34.       }
  35.       data.push({data: listAll[i]})
  36.     }
  37.   }
  38.   
  39.   //顯示資料
  40.   Logger.log(data);
  41.   
  42.   // 回傳json資料
  43.   return ContentService.createTextOutput(JSON.stringify(data))
  44.     .setMimeType(ContentService.MimeType.JSON);
  45. }
複製代碼


HTML 碼
  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <script type="text/javascript">
  5. Date.prototype.format = function(fmt)
  6. {
  7.   var o = {
  8.     "M+" : this.getMonth()+1, //月份
  9.     "d+" : this.getDate(), //日
  10.     "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小時
  11.     "H+" : this.getHours(), //小時
  12.     "m+" : this.getMinutes(), //分
  13.     "s+" : this.getSeconds(), //秒
  14.     "q+" : Math.floor((this.getMonth()+3)/3), //季度
  15.     "S" : this.getMilliseconds() //毫秒
  16.   };
  17.   if(/(y+)/.test(fmt))
  18.     fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  19.   for(var k in o)
  20.     if(new RegExp("("+ k +")").test(fmt))
  21.   fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  22.   return fmt;
  23. }

  24. var dateReviver = function (key, value) {
  25.     var a;
  26.     if (typeof value === 'string') {
  27.         a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
  28.         if (a) {
  29.             return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])).format("yyyy-MM-dd HH:mm:ss");
  30.         }
  31.     }
  32.     return value;
  33. };
  34. function inq()
  35. {
  36. var xmlhttp;

  37.         if (window.XMLHttpRequest)
  38.           {// code for IE7+, Firefox, Chrome, Opera, Safari
  39.           xmlhttp=new XMLHttpRequest();
  40.           }
  41.         else
  42.           {// code for IE6, IE5
  43.           xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  44.           }
  45.         xmlhttp.onreadystatechange=function()
  46.           {
  47.                   if (xmlhttp.readyState==4 && xmlhttp.status==200)      
  48.                   {
  49.                         var result=xmlhttp.responseText;
  50.                         var obj = JSON.parse(result,dateReviver);//解析json字串為json物件形式
  51.                                                 
  52.                         var html = '<table border=1 width=100%>';//
  53.                         
  54.                         for (var i = 0; i < obj.length; i ++ ) {//
  55.                                 html  += '<tr>';//
  56.                                                                 if(i==0)
  57.                                                                   html+="<td>編號</td>";
  58.                                                                 else
  59.                                                                   html+="<td>"+'<input type=checkbox id="OrderID" value="'+obj[i].data[0]+'">'+i+"</td>";
  60.                                 for(j=0;j<obj[i].data.length;j++)
  61.                                 {
  62.                                   html+= '<td>'+obj[i].data[j]+'</td>';
  63.                                 }
  64.                                 html  += '</tr>';            
  65.                         }
  66.                         html+="</table>";
  67.                         
  68.                         document.getElementById("order_status").innerHTML=html;
  69.                         if(obj.length==1) //只有一筆代表查不到資料
  70.                                 alert('查無資料');
  71.                   }

  72.           }
  73.     var url="https://script.google.com/macros/s/AKfycbyfMWCTwkU8bhdkcrL7hxcGc4yfXjY8Fj9jO37g9KfVk5MgNNBx/exec";
  74.         
  75.         var OrderID_list="";
  76.                 if (typeof(OrderID) !== 'undefined')
  77.                 {
  78.                         for (var i = 0; i < OrderID.length; i++) {
  79.                           if (OrderID[i].checked) {
  80.                                         OrderID_list += OrderID[i].value + ",";
  81.                           }
  82.                         }
  83.                         if(OrderID_list.length>0)
  84.                            OrderID_list=OrderID_list.substr(0,OrderID_list.length-1);
  85.                         if(Array.isArray(OrderID)==false)//單一個選項
  86.                                 OrderID_list=OrderID.value;
  87.                 }
  88.                 var strBeginDate=BeginDate.value;
  89.                 var strEndDate=EndDate.value;
  90.                 strBeginDate=strBeginDate.replace(/-/g,'/');
  91.                 strEndDate=strEndDate.replace(/-/g,'/');
  92.                
  93.                 url+="?BeginDate="+strBeginDate+"&EndDate="+strEndDate+"&OrderID="+OrderID_list+"&OrderStatus="+OrderStatus.value+"&member="+member.value;
  94.                 console.log(url);
  95.         xmlhttp.open("get",url,true);
  96.         xmlhttp.send();
  97. }

  98. </script>
  99. </head>
  100. <body>
  101. 輸入開始訂購日期:<input type="date" id="BeginDate" value="" /><br/>
  102. 輸入結束訂購日期:<input type="date" id="EndDate" value="" /><br/>
  103. 訂單狀況:<input type="text" id="OrderStatus" value="" /><br/>
  104. <input type="button" name="inq" value="查詢/更新" onclick="inq();"></br>
  105. <span id="order_status"></span>
  106. 訂單人員:<select id="member" name="member">
  107.     <option value="">處理人員請選擇你分組</option>
  108.     <option value="dog">Dog</option>
  109.     <option value="cat" selected>Cat</option>
  110.     <option value="hamster">Hamster</option>
  111.     <option value="parrot">Parrot</option>
  112.     <option value="spider" disabled>Spider</option>
  113.     <option value="goldfish">Goldfish</option>
  114. </select>

  115. </body>
  116. </html>
複製代碼
回復 支持 反對

使用道具 舉報

 樓主| 發表於 7 天前 | 顯示全部樓層

您的.
  1. var member=params.members;
複製代碼

應該是
  1. var member=params.member;
複製代碼

您多加了一個s
回復 支持 反對

使用道具 舉報

發表於 7 天前 | 顯示全部樓層
謝謝老師幫我修正一個字 但是改好以後 還是無法
回復 支持 反對

使用道具 舉報

 樓主| 發表於 7 天前 | 顯示全部樓層
amdamd 發表於 2021-7-19 20:32
謝謝老師幫我修正一個字 但是改好以後 還是無法

您有重新部暑並取得新的網址嗎?
回復 支持 反對

使用道具 舉報

發表於 7 天前 | 顯示全部樓層
本帖最後由 amdamd 於 2021-7-19 21:51 編輯
imingho 發表於 2021-7-19 20:50
您有重新部暑並取得新的網址嗎?

我有新增到32次了 但還是沒成功 '我就重新做一次就成功了 太好了
十分謝謝老 師幫忙  
回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|彰化一整天的論壇(Excel,Office)

GMT+8, 2021-7-26 01:02 , Processed in 0.114386 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表