簡體   English   中英

Google Sheets Scripts - 對於范圍內的每個單元格,獲取單元格具有特定值的行號,將行復制到范圍內的第一個空白行

[英]Google Sheets Scripts - For each cell in range, get row number where cell has specific value, copy row to first blank row in range

我來自 VB 背景,在為 Sheets 實現腳本解決方案時遇到了一些麻煩,我想 function 相當基本,但還不確定如何在 JS 中表達它。 目標是遍歷范圍內的每個單元格(表 1,Q3:Q1000),獲取該范圍內單元格值為“TRUE”的行號,復制/剪切表 1 上滿足的每一行的全部內容該限定條件(或簡單地存儲值並跳過復制/粘貼步驟),將值粘貼到單獨的工作表(Sheet2)上的第一個未使用的行,然后刪除 Sheet1 上的原始行。

到目前為止,我已經設法將這個粗略的 function 放在一起,它成功地找到了給定范圍內包含指定值的第一個單元格的行號,但如果在該范圍內多次出現該值,它將返回 NaN。 任何關於我做錯了什么的跡象都會有所幫助,謝謝。

function onEditTesting(e) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
const range = "Q3:1000";
var whereTrue = "TRUE";
var range = sheet.getRange("Q3:Q1000");
var rangeValues = sheet.getRange(range).getValues();

var i = []; 
for (var y = 0; y < rangeValues.length; y++) {
   if(rangeValues[y] == whereTrue){
      i.push(y);
   }
}

var Row = Number(i)+Number(range.getRow());

}
function moveData() {
  const ss=SpreadsheetApp.getActive();
  const ssh=ss.getSheetByName('Sheet1');
  const dsh=ss.getSheetByName('Sheet2');
  const vs=ssh.getRange(3,1,ssh.getLastRow()-2,ssh.getLastColumn()).getValues();
  let oA=[];
  let d=0;
  vs.forEach((r,i)=>{
    if(r[16]=='TRUE') {
      oA.push(r);
      ssh.deleteRow(i+3-d++);
    }
  });
  dsh.getRange(dsh.getLastRow()+1,1,oA.length,oA[0].length).setValues(oa);
}

這是使用onEdit() Simple Trigger的另一種方法。

示例代碼:

function onEdit(e) {
  var ss = e.source;
  var cell = e.range;
  var sourceSheet = ss.getActiveSheet();
  var destinationSheet = ss.getSheetByName("Sheet2");

  var col = cell.getColumn();
  var row = cell.getRow();
  var lastCol = sourceSheet.getLastColumn();

  Logger.log("row: "+row+" maxCol: "+lastCol+" col: "+col+" val: "+cell.getDisplayValue()+" sheet: "+sourceSheet.getName());
  //Check if modified cell is in column Q (index 17) in Sheet1 has a value of TRUE
  if(sourceSheet.getName() == "Sheet1" && col == 17 && cell.getDisplayValue() == "TRUE"){
    //Append current row to the destination sheet
    var values = sourceSheet.getRange(row,1,1,lastCol).getValues();
    Logger.log(values);
    destinationSheet.appendRow(values.flat());
    
    //Delete current row
    sourceSheet.deleteRow(row);
  }
}

它能做什么?

  1. 獲取使用 e.range 事件 object 修改的 sourceSheet 和單元格
  2. 檢查修改的單元格是否位於 Sheet1 的 Q 列(索引 17)中,值為“TRUE”。 我使用Range.getDisplayValue()來獲取單元格的實際字符串值,因為當我使用Range.getValue()對其進行測試時,它給了我一個 boolean object
  3. 使用Sheet.getLastColumn()Sheet.getRange(row, column, numRows, numColumns)獲取當前行的第一列到最后一列的行值
  4. Append 使用Sheet.appendRow(rowContents)將源工作表的當前行值到目標工作表,其中rowContents是一維數組,由於Range.getValues()返回一個二維數組,我使用了 array.flat()將二維數組轉換為一維數組
  5. 使用Sheet.deleteRow(rowPosition)刪除當前行

Output:

之前(表 1):

在此處輸入圖像描述

之后(表 1):

在此處輸入圖像描述

之后(表 2):

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM