Google 表脚本如果函数具有多个条件

Google sheets script if function with several criteria

我使用了一个脚本,其中有一行带有 IF 函数的内容:如果在“Suivi Clients”选项卡的第 21 列中有值“OUI”或“ANNULÉ”,则该函数将执行。

if (sh.getName() == 'Suivi Clients' && rng.getColumn() == 21)  {
    if (rng.getValue() == 'OUI' || rng.getValue() == 'ANNULÉ') {

我想修改为:如果在“Suivi Clients”选项卡的第 21 列和第 12 列中存在值“OUI”或“ANNULÉ”,则函数将执行。

我这样试过,但没用。

if (sh.getName() == 'Suivi Clients' && rng.getColumn() == 12 && rng.getColumn() == 21)  {
    if (rng.getValue() == 'OUI' || rng.getValue() == 'ANNULÉ') {

床单在这里:

https://docs.google.com/spreadsheets/d/1CPcMx3Dhbqi-zO4D3jYNxO-PGjyW3iTfRo5gRmEB9p4/edit#gid=0

完整的修改代码在这里:

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var rng = e.source.getActiveRange();

  if (sh.getName() == 'Suivi Clients' && rng.getColumn() == 21)  {
    if (rng.getValue() == 'OUI' || rng.getValue() == 'ANNULÉ') {

      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients Finalisé')
      dest.insertRowBefore(7)

      var plage = sh.getRange('C' + rng.getRow() + ':G' + rng.getRow())
      plage.copyTo(dest.getRange("C7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('L' + rng.getRow() + ':N' + rng.getRow())
      plage.copyTo(dest.getRange("L7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('P' + rng.getRow())
      plage.copyTo(dest.getRange("P7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('U' + rng.getRow() + ':W' + rng.getRow())
      plage.copyTo(dest.getRange("U7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortCF()
    }
  }

  if (sh.getName() == 'Clients Finalisé' && rng.getColumn() == 12 || rng.getColumn() == 21) {
    if (rng.getValue() == 'NON') {

      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Suivi Clients')
      dest.insertRowBefore(7)

      var plage = sh.getRange('C' + rng.getRow() + ':G' + rng.getRow())
      plage.copyTo(dest.getRange("C7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('L' + rng.getRow() + ':N' + rng.getRow())
      plage.copyTo(dest.getRange("L7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('P' + rng.getRow())
      plage.copyTo(dest.getRange("P7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('U' + rng.getRow() + ':W' + rng.getRow())
      plage.copyTo(dest.getRange("U7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortSC()
    }
  }

  if (sh.getName() != 'Suivi Clients') return;
  var editRange = {
    top: 6,
    left: 3,
    right: 7
  };
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;
  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;
  removeEmpty()
}

function sortSC() { // Suivi Clients
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Suivi Clients");
  var range = sheet.getRange("B6:W" + (sheet.getLastDataRow(3)));
  range.sort({ column: 7, ascending: true });
}

function sortCF() { // Clients Finalisé
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Clients Finalisé");
  var range = sheet.getRange("B6:W" + (sheet.getLastDataRow(3)));
  range.sort({ column: 16, ascending: true });
}

Object.prototype.getLastDataRow = function (col) {
  var lastRow = this.getLastRow();
  if (col == null) { col = 1 }
  var range = this.getRange(lastRow, col);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }
};

完整的有效代码在这里:

function onEdit(e) {
  var spreadsheet = e.source;
  var sh = spreadsheet.getActiveSheet();
  var rng = spreadsheet.getActiveRange();
  var rngRow = rng.getRow();
  var rngCol = rng.getColumn();

  if (sh.getName() == 'Suivi Clients') {
    var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients Finalisé');
    var otherCol = sh.getName() == 'Suivi Clients' ? rngCol == 12 ? 21 : 12 : '';
    var [cell, otherCell] = sh.getRangeList([`R${rngRow}C${rngCol}`, `R${rngRow}C${otherCol}`])
      .getRanges().map(range => range.getValue());

    if ((cell == 'OUI' || cell == 'ANNULÉ') && (otherCell == 'OUI' || otherCell == 'ANNULÉ')) {

      dest.insertRowBefore(7)

      sh.getRangeList([`C${rngRow}:G${rngRow}`, `L${rngRow}:N${rngRow}`, `P${rngRow}`, `U${rngRow}:W${rngRow}`])
        .getRanges().forEach(range => range.copyTo(dest.getRange(`${range.getA1Notation()[0]}7`), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false))

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortCF()
    }

  } else if (sh.getName() == 'Clients Finalisé') {
    var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Suivi Clients');
    var otherCol = sh.getName() == 'Clients Finalisé' ? rngCol == 12 ? 21 : 12 : '';
    var [cell, otherCell] = sh.getRangeList([`R${rngRow}C${rngCol}`, `R${rngRow}C${otherCol}`])
      .getRanges().map(range => range.getValue());
      
    if ((cell == 'NON') || (otherCell == 'NON')) {

      dest.insertRowBefore(7)

      sh.getRangeList([`C${rngRow}:G${rngRow}`, `L${rngRow}:N${rngRow}`, `P${rngRow}`, `U${rngRow}:W${rngRow}`])
        .getRanges().forEach(range => range.copyTo(dest.getRange(`${range.getA1Notation()[0]}7`), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false))

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortSC()
    }
  }  

  if (sh.getName() != 'Suivi Clients') return;
  var editRange = {
    top: 6,
    left: 3,
    right: 7
  };
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;
  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;
  removeEmpty()
}

function sortSC() { // Suivi Clients
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Suivi Clients");
  var range = sheet.getRange("B6:W" + (sheet.getLastDataRow(3)));
  range.sort({ column: 7, ascending: true });
}

function sortCF() { // Clients Finalisé
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Clients Finalisé");
  var range = sheet.getRange("B6:W" + (sheet.getLastDataRow(3)));
  range.sort({ column: 16, ascending: true });
}

Object.prototype.getLastDataRow = function (col) {
  var lastRow = this.getLastRow();
  if (col == null) { col = 1 }
  var range = this.getRange(lastRow, col);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }
};

试试下面的代码:

function onEdit(e) {
  var spreadsheet = e.source;
  var sh = spreadsheet.getActiveSheet();
  var rng = spreadsheet.getActiveRange();
  var rngRow = rng.getRow();
  var rngCol = rng.getColumn();

  var dest = spreadsheet.getSheetByName('Clients Finalisé');

  var otherCol = sh.getName() == 'Suivi Clients' ? rngCol == 12 ? 21 : 12 : '';
  var [cell, otherCell] = sh.getRangeList([`R${rngRow}C${rngCol}`, `R${rngRow}C${otherCol}`])
                              .getRanges().map(range => range.getValue());

  if ((cell == 'OUI' || cell == 'ANNULÉ') && (otherCell == 'OUI' || otherCell == 'ANNULÉ')) {

    dest.insertRowBefore(7)

      sh.getRangeList([`C${rngRow}:G${rngRow}`, `L${rngRow}:N${rngRow}`, `P${rngRow}`, `U${rngRow}:W${rngRow}`])
      .getRanges().forEach(range => range.copyTo(dest.getRange(`${range.getA1Notation()[0]}7`), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false))

    sh.deleteRow(rng.getRow())
    SpreadsheetApp.flush()
    sortCF()
    
  }
};

您的代码不起作用的原因是 rng.getColumn() == 12 && rng.getColumn() == 21 因为您使用的是 onEdit() 并且您只在一个单元格中进行编辑,所以从技术上讲,它只能是第 12 列或第 21 列。

在代码中,我添加了一个 var 来确定另一列,因此您可以同时保留两列。您现在可以检查单元格和 otherCell 是否为 'OUI' 或 'ANNULÉ'.

另外,对于复制多个范围的脚本,重复代码使用了太多行,所以我尝试将其缩短。

如果可行,请告诉我!

这里是关于如何复制多个范围的参考:

编辑 - 添加代码

正如您的评论所述:

Once a customer's row is in the "Clients Finalisé" tab, I would like that if I change the value of the L OR U column from "OUI" or "ANNULÉ" to "NON", the row goes back to the "Suivi Clients" tab.

我已经为此添加了代码。试试下面更新的代码:

function onEdit(e) {
  var spreadsheet = e.source;
  var sh = spreadsheet.getActiveSheet();
  var rng = spreadsheet.getActiveRange();
  var rngRow = rng.getRow();
  var rngCol = rng.getColumn();

  if (sh.getName() == 'Suivi Clients') {
    var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients Finalisé');
    var otherCol = sh.getName() == 'Suivi Clients' ? rngCol == 12 ? 21 : 12 : '';
    var [cell, otherCell] = sh.getRangeList([`R${rngRow}C${rngCol}`, `R${rngRow}C${otherCol}`])
      .getRanges().map(range => range.getValue());

    if ((cell == 'OUI' || cell == 'ANNULÉ') && (otherCell == 'OUI' || otherCell == 'ANNULÉ')) {

      dest.insertRowBefore(7)

      sh.getRangeList([`C${rngRow}:G${rngRow}`, `L${rngRow}:N${rngRow}`, `P${rngRow}`, `U${rngRow}:W${rngRow}`])
        .getRanges().forEach(range => range.copyTo(dest.getRange(`${range.getA1Notation()[0]}7`), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false))

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortCF()
    };

  } else if (sh.getName() == 'Clients Finalisé') {
    var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Suivi Clients');
    var otherCol = sh.getName() == 'Clients Finalisé' ? rngCol == 12 ? 21 : 12 : '';
    var [cell, otherCell] = sh.getRangeList([`R${rngRow}C${rngCol}`, `R${rngRow}C${otherCol}`])
      .getRanges().map(range => range.getValue());
      
    if ((cell == 'NON') || (otherCell == 'NON')) {

      dest.insertRowBefore(7)

      sh.getRangeList([`C${rngRow}:G${rngRow}`, `L${rngRow}:N${rngRow}`, `P${rngRow}`, `U${rngRow}:W${rngRow}`])
        .getRanges().forEach(range => range.copyTo(dest.getRange(`${range.getA1Notation()[0]}7`), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false))

      sh.deleteRow(rng.getRow())
      SpreadsheetApp.flush()
      sortSC()
    };
  };
};

这是按照规定的条件工作的:

"Suivi Clients" tab to be "OUI" or "ANNULÉ" in the L AND U column so that the rows go from "Suivi Clients" to "Clients Finalisé"

Once a customer's row is in the "Clients Finalisé" tab, I would like that if I change the value of the L OR U column from "OUI" or "ANNULÉ" to "NON", the row goes back to the "Suivi Clients" tab

在里面添加你的其他功能。或者检查你提供的虚拟 sheet 我已经在那里添加了完整的代码。我也测试过。让我知道它是否有效。