我一直在做一個個人專案,遇到了一個問題,我無法弄清楚'當有隱藏資料(例如復選框)時如何獲取特定表的最后一行。' 我一直在研究這個主題,并找到了一個可能的解決方案,但我不確定如何將它放入我的代碼中,或者我是否可以將它合并到我的代碼中,因為坦率地說,我對編碼語言還不是很流利。
以下代碼歸功于原作者 ( https://yagisanatode.com/ ):
function getLastRowSpecial(range){
var rowNum = 0;
var blank = false;
for(var row = 0; row < range.length; row ){
if(range[row][0] === "" && !blank){
rowNum = row;
blank = true;
}
else if (range[row][0] !== ""){
blank = false;
};
};
return rowNum;
};
這是我當前的代碼:
function onEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var currentSh = event.source.getActiveSheet();
var currentCell = event.source.getActiveRange();
if (currentSh.getName() == 'invoice_approval' && currentCell.getColumn() == 5 && currentCell.getValue()== 'Approved') {
var row = currentCell.getRow();
var numColumns = currentSh.getLastColumn();
var targetSh = ss.getSheetByName('open_invoices');
var target = targetSh.getRange(targetSh.getLastRow() 1, 1);
currentSh.getRange(row,1,1,numColumns).moveTo(target);
currentSh.deleteRow(row);
}
// (Moving back rows <open_invoices to invoice_approval> when a cell's value is changed from 'Approved')
else if (currentSh.getName() == 'open_invoices' && currentCell.getColumn() == 5 && currentCell.getValue()!= 'Approved' ) {
var row = currentCell.getRow();
var targetSh = ss.getSheetByName('invoice_approval');
var target = targetSh.getRange(targetSh.getLastRow() 1, 1);
currentSh.getRange(row,1,1,5).moveTo(target);
currentSh.deleteRow(row);
}
}
我制作了一個樣本表并列出了我面臨的問題:
https://docs.google.com/spreadsheets/d/1Yol5FAa3Sw84zRDanOCILUhD1IWMKjrHAJewT-P18to/edit?usp=sharing
uj5u.com熱心網友回復:
我相信你的目標如下。
- 當“invoice_approval”表的“E”列是 時
Approved,您想將該行移動到“open_invoices”表的第 1 個空行。 - 當“open_invoices”表的“E”列不是時
Approved,您希望將該行移動到“invoice_approval”表的第一個空行。
在這種情況下,如何進行以下修改?
修改后的腳本:
function onEdit(event) {
// This sample script is from https://stackoverflow.com/a/44563639
Object.prototype.get1stEmptyRowFromTop = function (columnNumber, offsetRow = 1) {
const range = this.getRange(offsetRow, columnNumber, 2);
const values = range.getDisplayValues();
if (values[0][0] && values[1][0]) {
return range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() 1;
} else if (values[0][0] && !values[1][0]) {
return offsetRow 1;
}
return offsetRow;
};
var {source, range} = event;
var currentSh = source.getActiveSheet();
var sheetName = currentSh.getSheetName();
if (sheetName == 'invoice_approval' && range.columnStart == 5 && range.getValue() == 'Approved') {
var row = range.rowStart;
var numColumns = currentSh.getLastColumn();
var targetSh = source.getSheetByName('open_invoices');
var target = targetSh.getRange(targetSh.get1stEmptyRowFromTop(1), 1);
currentSh.getRange(row, 1, 1, numColumns).moveTo(target);
currentSh.deleteRow(row);
} else if (sheetName == 'open_invoices' && range.columnStart == 5 && range.getValue() != 'Approved') {
var row = range.rowStart;
var targetSh = source.getSheetByName('invoice_approval');
var target = targetSh.getRange(targetSh.get1stEmptyRowFromTop(1), 1);
currentSh.getRange(row, 1, 1, 5).moveTo(target);
currentSh.deleteRow(row);
}
}
- 在此腳本中,使用了事件物件。Ref使用事件物件時,可以稍微降低處理成本。參考
- 為了從作業表頂部檢索第 1 個空行,我使用了此執行緒中的示例腳本。
參考:
- 事件物件
- 基準:Google Apps 腳本的事件物件
- 相關執行緒。
- Google Script - 獲取特定列的最后一行
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/325133.html
