[英]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.