星期日, 10月 05, 2025

[GAS] 存取 Google Sheets

在 Google Apps Script 內,透過 GetRange()、GetValue() 和 SetValue() 等相關函數,來針對 Google Sheets 進行 CRUD

Sample Data

請 AI 生成資料,故意把 RowPosition = 7 資料清除,變成空白資料

完整 .gs Code

後續會各別拆解說明
function CRUD() {

  // 取得目前作用中的試算表
  let sheetID = GetSheetID();
  let sheetName = 'Data';
  let ss = SpreadsheetApp.openById(sheetID);
  let sheet = ss.getSheetByName(sheetName);

  // 1. 顯示全部資料範圍內的資料

  // 會把第一 Row 標題一併顯示出來
  let dataRange = sheet.getDataRange().getValues();
  ShowData(dataRange);

  // 可以明確指定起始 Row,就可以避開第 1 row 的標題
  let range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
  Logger.log("getLastColumn():" + sheet.getLastColumn());
  Logger.log("getLastRow():" + sheet.getLastRow());
  ShowData(range);

  // 2. 取得特定 Row、Cell 資料

  // 取得特定 Row 資料,使用 getSheetValues 來取值
  let rowRange = sheet.getSheetValues(3, 1, 1, -1);
  ShowData(rowRange);

  // 取得特定 Cell 資料
  let cellRange = sheet.getRange(8, 2).getValues();
  ShowData(cellRange);

  // 3. 新增一筆資料:
  var insertData = ["GAS", "gas@gmail.com", "2025/10/05", "0909-010-101"];
  sheet.appendRow(insertData);
  let insertRange = sheet.getSheetValues(sheet.getLastRow(), 1, 1, -1);
  ShowData(insertRange);

  // 4. 更新資料:更新指定 cell 內資料

  let updateRange = sheet.getRange(8, 4);
  
  // 顯示更新前資料
  ShowData(updateRange.getValues());

  // 更新資料
  updateRange.setValue("從 GAS 進行更新");

  // 顯示更新後資料
  ShowData(updateRange.getValues());

  // 5. 刪除資料:刪除指定 RowPosition 的 Row
  let deleteRange = sheet.getRange(7, 1);
  sheet.deleteRow(deleteRange.getRow());

}

function ShowData(values) {

  for (let i = 0; i < values.length; i++) {

    let row = '';

    for (let j = 0; j < values[i].length; j++) {
      if (values[i][j]) {
        row = row + values[i][j];
      }

      row = `${row},`;
    }

    Logger.log(row);
  }
}

顯示全部資料範圍內的資料

使用 GetDataRange() 或是 GetRange() 來取得全部資料範圍後,再透過 GetValues() 來取得資料
  • GetRange(row , column ,  numRows , numColumns):指定起始 cell ( row  和 column) 並回傳指定的資料筆數 (numRows) 和欄位數 (numColumns)
  • GetDataRange:取得對應資料的 Range,等同於 GetRange(1 , 1 , Sheet.getLastRow() , Sheet.getLastColumn())
GetDataRange() 會包含第一 Row 標題,希望 Range 不包含第一 Row 的話,可以使用 GetRange(2 , 1 , Sheet.getLastRow() - 1 , Sheet.getLastColumn())
let range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
Logger.log("getLastColumn():" + sheet.getLastColumn());
Logger.log("getLastRow():" + sheet.getLastRow());
ShowData(range);
getDataRange() 和 getRange() 都會把範圍內的空白 Row 一併顯示出來,不會自動過濾掉


取得特定 Row 或 Cell 資料


取得指定起始 cell ( startRow  和 startColumn) 並回傳指定的資料筆數 (numRows) 和欄位數 (numColumns) 的值,比較特別的是 numRows 和 numColumns 設定為 -1 的話,代表最後一 Row 和最後一 Column,可以不透過 Sheet.getLastRow()、Sheet.getLastColumn() 取得

基本上 getSheetValues() 等同於 getRange() + getValues()
let rowRange = sheet.getSheetValues(3, 1, 1, -1);
ShowData(rowRange);


新增資料

appendRow(rowContents):在 Sheet 目前資料區域底部新增一筆 Row,萬一需要 insert 在特定 Row,請參考 InsertRow 相關函數
let insertData = ["GAS", "gas@gmail.com", "2025/10/05", "0909-010-101"];
sheet.appendRow(insertData);
let insertRange = sheet.getSheetValues(sheet.getLastRow(), 1, 1, -1);
ShowData(insertRange);

更新資料

setValue(value):設定指定 Range 值,值可以是數字、字串、布林值或日期
let updateRange = sheet.getRange(8, 4);
  
// 顯示更新前資料
ShowData(updateRange.getValues());

// 更新資料
updateRange.setValue("從 GAS 進行更新");

// 顯示更新後資料
ShowData(updateRange.getValues());

刪除資料

deleteRow(rowPosition):刪除指定 RowPostion 的 Row

rowPosition:Row 位置,第一 Row 從 1 開始,不是 0 喔

從文件上發現 getRow()getRowIndex() 都是取得 RowPosition,但 getRowIndex() 在名稱上容易引起誤會
let deleteRange = sheet.getRange(7, 1);
sheet.deleteRow(deleteRange.getRow());

沒有留言:

張貼留言