簡體   English   中英

在Google電子表格上基於1個單元格移動一行並確認第二個單元格不為空

[英]Moving a row on google spreadsheet based on 1 cell and verifying second cell is not blank

我是Google表格腳本的新手,我正在嘗試修改當前腳本,該腳本基於第20列中的“ y”或“ n”值將同一工作簿中的行從一張工作表移動到另一張工作表。新腳本仍將查看第20列中的“ y”或“ n”,但我希望它也查看第19列以驗證那里是否有值。 到目前為止,這是我的代碼,但無法正常工作:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = SpreadsheetApp.getActiveSheet();
  var r = SpreadsheetApp.getActiveRange();

  if (s.getName() == "2018 2 Week Snapshot for Jim"
      && r.getColumn() == 20
      && r.getValue() == "y") {
    if (s.getName() == "2018 2 Week Snapshot for Jim"
        && r.getColumn() == 19
        && r.getValue(r.isBlank()) == false) {
      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
      var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      s.getRange(row, 1, 1, numColumns).moveTo(target);
      s.deleteRow(row);
    }
  }
  if (s.getName() == "2018 2 Week Snapshot for Jim"
      && r.getColumn() == 20
      && r.getValue() == "n") {
    if(s.getName() == "2018 2 Week Snapshot for Jim"
        && r.getColumn() == 19
        && r.getValue(r.isBlank()) == false) {
      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
      var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      s.getRange(row, 1, 1, numColumns).moveTo(target);
      s.deleteRow(row);
    }
  }
}

問題的症結在於,不是使用直接獲取要查看的范圍,而是使用活動范圍( var r = SpreadsheetApp.getActiveRange(); ),並在兩個嵌套的if語句中檢查該范圍是否為無論是第19行還是第20行, 以及該范圍是否均為空白且包含某些內容(“ y”或“ n”)。 換句話說,為了進入您的第一段代碼,必須符合以下條件:

s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 20
&& r.getValue() == "y") {
&& s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 19
&& r.getValue(r.isBlank()) == false

不用說這在邏輯上是有問題的:-)

r.getValue(r.isBlank()) == falser.getValue(r.isBlank()) == false沒有多大意義-如果您要查找第19 r.isBlank()空白,則可能希望r.isBlank() 我的回答反映了這一點,如果我弄錯了,您應該將這種情況反轉。

我還注意到,無論您在第20列中找到的是“ y”還是“ n”,您的操作看起來都是相同的:無論哪種情況,您都將刪除原始行並將其粘貼到“ Jim的2018年回顧2周快照”中。 我的答案保留了區別,因為我認為您還想在看到ay / n的前提下做其他事情。

無論如何,這應該可以完成我認為您要嘗試執行的操作(請注意所有注意事項?:D)

function onEdit() {
  var r = SpreadsheetApp.getActiveRange();  // The range being edited
  var s = r.getSheet();                     // Its sheet
  if (s.getName() != "2018 2 Week Snapshot for Jim") {
    // We're not editing the sheet we're interested in...
    return;
  }
  var activeRow = r.getRow();  // What row number are we on?
  var colNineteenNotBlank = !s.getRange(activeRow, 19).isBlank();  // Or did you need this *not* to be blank?
  var colTwentyValue = s.getRange(activeRow, 20).getValue();
  var numColumns = s.getLastColumn();
  var sourceRange = s.getRange(activeRow,    // start this row
                               1,            // start column 1 (A)
                               1,            // range should be 1 row
                               numColumns);  // range should be this many columns
  var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1,
                                         1,
                                         1,
                                         numColumns);
  if (colTwentyValue == "y" && colNineteenNotBlank) {
    sourceRange.moveTo(targetRange);
  } else if (colTwentyValue == "n" && colNineteenNotBlank) {
    // maybe you wanted something else here?
    sourceRange.moveTo(targetRange);
  }
}

這仍然不是防彈的。 如果目標工作表已滿,我不確定在工作表的“結束”范圍之外進行調整是否可行。 如果很常見,我將檢查targetSheet.getMaxRow()targetSheet.getLastRow()匹配,如果匹配,請執行targetSheet.appendRow()

要使用“基於活動單元”解決方案,您需要利用onEdit事件的e參數。

檢查該范圍是否是您要測試的范圍,然后測試該值是否正確,然后檢查另一個范圍的相同內容(在此情況下為列S)。

您會后檢查moveTo至目的地的電子表格,並刪除移動一行。

該代碼將執行以下操作:

function onEdit(e)
{
  if (e.range.getColumn() == 20)
  {
    if(e.value == "Y" || e.value == "N" || e.value == "y" || e.value == "n" )
    {
      var val = e.source.getActiveSheet().getRange("S" + e.range.getRow()).getValue();
      if (val == "Y" || val == "y" || val == "N" || val == "n")
      {
        var destSheetName = "Reviewed 2018 2 Week Snapshot for Jim";
        var destSheet = e.source.getSheetByName(destSheetName);
        e.source.getActiveSheet().getRange(e.range.getRow(), 1, 1, e.source.getActiveSheet().getLastColumn()).moveTo(destSheet.getRange(destSheet.getLastRow() + 1 , 1, 1, e.source.getActiveSheet().getLastColumn()));
        e.source.getActiveSheet().deleteRow(e.range.getRow());
      }
    }
  }
}

暫無
暫無

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

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