Google sheets 如何有条件地将google sheets中的一行复制到循环中的选项卡,但不复制
好的,这里是完整的新手…我已经搜索并找到了各种“将行复制到另一个工作表”脚本,但只能找到一个。下面是我的博得版本。我想做的是让前页显示第1页中满足三个条件之一的行,即N列的状态为“编辑”、“SB编辑”或“修改编辑”。下面的代码可以做到这一点,但它不会循环,每次我运行它时,它都会重复该操作,我会得到目标工作表上所有行的副本。 基本上,我希望它运行时,当某一行的列N的状态更改为这三个值之一时,它将显示在第2页上。因此,表2是表1中所有行的“实时”显示,其中列N等于指定值 非常感谢您的帮助Google sheets 如何有条件地将google sheets中的一行复制到循环中的选项卡,但不复制,google-sheets,Google Sheets,好的,这里是完整的新手…我已经搜索并找到了各种“将行复制到另一个工作表”脚本,但只能找到一个。下面是我的博得版本。我想做的是让前页显示第1页中满足三个条件之一的行,即N列的状态为“编辑”、“SB编辑”或“修改编辑”。下面的代码可以做到这一点,但它不会循环,每次我运行它时,它都会重复该操作,我会得到目标工作表上所有行的副本。 基本上,我希望它运行时,当某一行的列N的状态更改为这三个值之一时,它将显示在第2页上。因此,表2是表1中所有行的“实时”显示,其中列N等于指定值 非常感谢您的帮助 funct
function copyrange() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet 1'); //source sheet
var testrange = sheet.getRange('N:N');
var testvalue = (testrange.getValues());
var csh = ss.getSheetByName('Sheet 2'); //destination sheet
var data = [];
var j =[];
//Condition check in N:N; If true copy the same row to data array
for (i=0; i<testvalue.length;i++) {
if ( testvalue[i] == 'Edit') {
data.push.apply(data,sheet.getRange(i+1,1,1,15).getValues());
//Copy matched ROW numbers to j
j.push(i);
}
}
//Copy data array to destination sheet
csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);
for (i=0; i<testvalue.length;i++) {
if ( testvalue[i] == 'Amend Edit') {
data.push.apply(data,sheet.getRange(i+1,1,1,15).getValues());
//Copy matched ROW numbers to j
j.push(i);
}
}
//Copy data array to destination sheet
csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);
for (i=0; i<testvalue.length;i++) {
if ( testvalue[i] == 'SB Edit') {
data.push.apply(data,sheet.getRange(i+1,1,1,15).getValues());
//Copy matched ROW numbers to j
j.push(i);
}
}
//Copy data array to destination sheet
csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);
//Delete matched rows in source sheet
//for (i=0;i<j.length;i++){
//var k = j[i]+1;
//sheet.deleteRow(k);
//Alter j to account for deleted rows
//if (!(i == j.length-1)) {
//j[i+1] = j[i+1]-i-1;
}
函数copyrange(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName('sheet 1');//源工作表
var testrange=sheet.getRange('N:N');
var testvalue=(testrange.getValues());
var csh=ss.getSheetByName('Sheet 2');//目标工作表
var数据=[];
var j=[];
//条件签入N:N;如果为true,则将同一行复制到数据数组
对于(i=0;i如果您希望在修改列N时发生该复制,那么最好设置一个触发器,如。这将为您提供一个对象,其中包含所发生事件的数据,包括更改的单元格及其值
然后可以使用这些数据获取整行并将其复制到另一张图纸,如下所示:
function onEdit(e) {
const statuses = ['Edit', 'SB Edit', 'Amend Edit'];
// Check if the modification happened on column N (14th column) and if the new value is one of the desired statuses
if (e.range.getColumn() === 14 && statuses.includes(e.value)) {
// Get sheets
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = spreadsheet.getSheetByName('Sheet1');
const sheet2 = spreadsheet.getSheetByName('Sheet2');
// Get the whole row of the modified cell
const modifiedRow = sheet1.getRange(e.range.getRow(), 1, 1, sheet1.getLastColumn()).getValues();
// Append modified row to the end of Sheet2
sheet2.appendRow(modifiedRow.flat());
}
}
如果要避免在Sheet2中重复行,则需要有一种方法来检查特定行是否在之前添加到Sheet2
例如,如果列A具有行的唯一标识符(ID),则可以在追加新行之前在Sheet2中搜索该ID。如果该ID存在,则可能希望将其替换为新值,或者什么也不做。如果该ID不存在,则将该行追加到末尾:
function onEdit(e) {
// Check if the modification happened on column N (14th column) and if the new value is one of the desired statuses
if (e.range.getColumn() === 14) {
// Specify update statuses
const addStatuses = ['Edit', 'SB Edit', 'Amend Edit'];
const removeStatuses = ['On Hold', 'Version Returned'];
// Get sheets
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = spreadsheet.getSheetByName('Sheet1');
const sheet2 = spreadsheet.getSheetByName('Sheet2');
// Get the whole row of the modified cell
const modifiedRow = sheet1.getRange(e.range.getRow(), 1, 1, sheet1.getLastColumn()).getValues();
// Assume that ID is in column A (first column)
const modifiedRowID = modifiedRow[0][0];
// Get values from Sheet2
const columnValues = sheet2.getDataRange().getValues();
// Check if Sheet2 already has row based on the value of column A and retrieve its index
let rowIndex = -1;
for (let i = 0; i < columnValues.length; i++) {
if (columnValues[i][0] == modifiedRowID) {
rowIndex = i + 1; // JavaScript arrays indices start from 0, but Sheets row indices start from 1
break;
}
}
// If row should be added/removed to/from Sheet2
if (addStatuses.includes(e.value)) {
if (rowIndex == -1) {
// Row not found in Sheet2, so add it
sheet2.appendRow(modifiedRow.flat());
} else {
// Optional: Row found in Sheet2, so replace it with current values
sheet2.getRange(rowIndex, 1, 1, modifiedRow[0].length).setValues(modifiedRow);
}
} else if (removeStatuses.includes(e.value) && rowIndex > -1) {
// Remove row from Sheet2
sheet2.deleteRow(rowIndex);
}
}
}
函数onEdit(e){
//检查是否在第N列(第14列)上进行了修改,以及新值是否为所需状态之一
if(e.range.getColumn()==14){
//指定更新状态
const addStatuses=[“编辑”、“SB编辑”、“修改编辑”];
const removestates=[“暂停”,“返回的版本”];
//拿床单
const spreadsheet=SpreadsheetApp.getActiveSpreadsheet();
const sheet1=电子表格.getSheetByName('sheet1');
const sheet2=电子表格.getSheetByName('sheet2');
//获取修改单元格的整行
const modifiedRow=sheet1.getRange(e.range.getRow(),1,1,sheet1.getLastColumn()).getValues();
//假设ID位于A列(第一列)
const modifiedRowID=modifiedRow[0][0];
//从Sheet2获取值
const columnValues=sheet2.getDataRange().getValues();
//根据列A的值检查Sheet2是否已经有行,并检索其索引
让rowIndex=-1;
for(设i=0;i-1){
//从活页2中拆下行
表2.删除行(行索引);
}
}
}
Wow,非常感谢您花时间提供帮助……非常感谢。在尝试运行第一部分(或第二版本)时,我收到了此错误消息……我尝试用谷歌搜索它的一些部分来了解它,但是,没有,超越我键入错误:无法读取未定义的属性“范围”(第5行,文件“editon”)这是因为您可能正试图从编辑器中运行该函数,但是,由于它是一个触发器,因此每当修改工作表时,都会自动调用它。您计划如何从编辑器中手动执行该函数,还是让它作为一个自动触发器执行?啊……这将是我的重点:)理想情况下,自动触发器会再次很棒,感谢你在这方面款待我的无能。我在工程学位上做的最后一次编码涉及turbo pascal:)不用担心:)如果你想将其作为触发器,那么你只需要将其包含在Code.gs中并保存它。每当编辑工作表时,onEdit()函数将被自动调用。这是我用来测试的表单:明白了,现在了解触发器是如何工作的。是的,它工作得很好。我有一个疏忽,但我没有仔细考虑。这些是跟踪动画项目,这些项目将受到修改。这会添加实时项目,但不会删除是否有一种简单的方法,如果工作表1上的状态更改为“保留”或“已返回版本”,则会从工作表2中删除该行?即,由于该状态可以在编辑和已返回版本之间更改,然后再返回编辑,因此会复制该行,然后从工作表2中删除该行?