iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0

今天我們對單據管理系統新增一個功能,就是查詢並修改。
只要我們的試算表裡面有同樣的單據編號就可以更改!

程式碼解析

// 查詢單據
function queryBill(billNo) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("單據資料");
  var data = sheet.getDataRange().getValues();

  for (var i = 1; i < data.length; i++) {
    if (data[i][0] == billNo) { // 假設單據編號在第一欄
      var billData = {
        billNo: data[i][0],
        customerName: data[i][1],
        item: data[i][2],
        amount: data[i][3],
        date: data[i][4],
        notes: data[i][5],
        row: i + 1
      };
      return JSON.stringify(billData);
    }
  }

  return JSON.stringify({ error: "查無此單據編號。" });
}

SpreadsheetApp.getActiveSpreadsheet():取得目前開啟的 Google 試算表。
.getSheetByName("單據資料"):取得名為「單據資料」的工作表。
sheet.getDataRange().getValues():取得該工作表的所有資料,並以二維陣列形式存放。

for (var i = 1; i < data.length; i++):從第 2 列開始(i=1),跳過標題列。
if (data[i][0] == billNo):判斷該列的單據編號(第 1 欄)是否等於使用者查詢的 billNo。
如果找到匹配的單據:
建立一個 billData 物件,包含該單據所有欄位資料。
row: i + 1:記錄資料所在的實際列數(Google 試算表從 1 開始計數)。
使用 JSON.stringify 將物件轉成 JSON 字串返回,方便前端解析。

如果整個迴圈跑完都沒有找到單據編號,就回傳一個 JSON 物件,告訴前端查無資料。
前端可以用 JSON.parse() 解析這個字串,並顯示錯誤訊息。

// 修改單據
function editBill(data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("單據資料");
  var row = Number(data.row);

  var newValues = [
    data.billNo,
    data.customerName,
    data.item,
    data.amount,
    data.date,
    data.notes
  ];

  sheet.getRange(row, 1, 1, 6).setValues([newValues]);
  return "單據修改成功!";
}

取得名為「單據資料」的工作表。
data.row 是前端傳來的資料所在列數(查詢時記錄的 row)。
Number(data.row) 把它轉成數字型態,確保後續操作正確。

將修改後的單據資料整理成一個陣列 newValues,順序對應試算表的欄位:
[單據編號, 客戶名稱, 品項, 金額, 日期, 備註]

sheet.getRange(row, 1, 1, 6):從第 row 列,第 1 欄開始高度 1 列,寬度 6 欄,也就是定位到這筆資料的整行。
.setValues([newValues]):把整理好的陣列寫入這一行, setValues 需要一個「二維陣列」,所以外層加了 [ ]。

結果

網站:單據管理系統實作


上一篇
D13 單據管理系統實作
下一篇
D15 line notify替代
系列文
Google App Script雲端自動化與動態網頁實戰20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言