繁体   English   中英

谷歌表格脚本如果 function 有几个标准

[英]Google sheets script if function with several criteria

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

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

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

我试过这样但它不起作用。

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 来确定另一列,因此您可以同时保留两列。 您现在可以检查单元格和其他单元格是“OUI”还是“ANNULÉ”。

此外,对于复制多个范围的脚本,它为重复代码使用了太多行,因此我试图将其缩短。

让我知道这个是否奏效!

以下是有关如何复制多个范围的参考: Apps script copy multiple range from 1 sheet to another spreadsheet

编辑 - 添加代码

正如您的评论所述:

一旦客户的行位于“Clients Finalisé”选项卡中,我希望如果我将 L 或 U 列的值从“OUI”或“ANNULÉ”更改为“NON”,该行将返回到“Suivi Clients” “ 标签。

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

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”选项卡的 L 和 U 列中的“OUI”或“ANNULÉ”,以便从“Suivi Clients”到“Clients Finalisé”的行 go

一旦客户的行位于“Clients Finalisé”选项卡中,我希望如果我将 L 或 U 列的值从“OUI”或“ANNULÉ”更改为“NON”,该行将返回到“Suivi Clients” “ 标签

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM