星期二, 10月 21, 2025

[GAS] 搜尋資料

以會員登錄系統來記錄,登錄時搜尋使用者 email 是否存在 Google Sheets 內並回傳整筆資料或更新該筆資料

Google Sheets 資料

寫法一:find

使用 getDataRange 搭配 getValues 讀取全部資料 (包含標題) 進記憶體,再透過 find 來找出該筆資料
function 寫法一(email) {

  let sheet = GetSheet_Member();
  let dataRange = sheet.getDataRange();
  let values = dataRange.getValues();
  let row = values.find(r => r[1] === email);
  if (!row) {
    return {
      success: false,
      error: "該 email 不存在"
    };
  }

  return {
    success: true,
    data: {
      姓名: row[0],
      電子信箱: row[1]
    }
  }
}

寫法二:findIndex

使用 getRange() 搭配 getLastRow() 明確指定範圍來讀取全部資料 (不包含標題) 進記憶體,再透過 findIndex 來找出該筆資料,因為是抓取全部資料,所以 findIndex 找出該筆資料的 rowIndex 後, rowIndex + [標題 Row] + [rowIndex 和 rowPosition 起始點差值] ,即為該筆資料在 Sheet 內的 RowPosition
function 寫法二(email) {
  let sheet = GetSheet_Member();
  let lastRow = sheet.getLastRow();
  let limitedRange = sheet.getRange(`A2:B${lastRow}`);
  let values = limitedRange.getValues();
  let rowIndex = values.findIndex(r => r[1] === email);
  if (rowIndex === -1) {
    return {
      success: false,
      error: "該 email 不存在"
    };
  }

  let rowPosition = rowIndex + 2; // 2 為 [標題 Row] + [rowIndex 和 rowPosition 起始差值]
  let columnC = 3;
  sheet.getRange(rowPosition, columnC).setValue("是");
  return {
    success: true,
    error: "更新成功"
  };
}

寫法三:createTextFinder

使用 createTextFinder() 直接搜尋 Google Sheet 內資料,沒有把全部資料拉進記憶體內進行搜尋,詳見 [GAS] TextFinder 筆記
function 寫法三(email) {

  let sheet = GetSheet_Member();
  let columnB = sheet.getRange("B:B");
  let textFinder = columnB.createTextFinder(email);
  let foundRange = textFinder
    .matchEntireCell(true)
    .findNext();

  if (!foundRange) {
    return {
      success: false,
      error: "該 email 不存在"
    };
  }

  let rowPosition = foundRange.getRow();
  let columnA = 1;
  let rangeA = sheet.getRange(rowPosition, columnA);

  return {
    success: true,
    data: {
      姓名: rangeA.getValue(),
      電子信箱: email
    }
  }
}

沒有留言:

張貼留言