Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets 如何有条件地将google sheets中的一行复制到循环中的选项卡,但不复制_Google Sheets - Fatal编程技术网

Google sheets 如何有条件地将google sheets中的一行复制到循环中的选项卡,但不复制

Google sheets 如何有条件地将google sheets中的一行复制到循环中的选项卡,但不复制,google-sheets,Google Sheets,好的,这里是完整的新手…我已经搜索并找到了各种“将行复制到另一个工作表”脚本,但只能找到一个。下面是我的博得版本。我想做的是让前页显示第1页中满足三个条件之一的行,即N列的状态为“编辑”、“SB编辑”或“修改编辑”。下面的代码可以做到这一点,但它不会循环,每次我运行它时,它都会重复该操作,我会得到目标工作表上所有行的副本。 基本上,我希望它运行时,当某一行的列N的状态更改为这三个值之一时,它将显示在第2页上。因此,表2是表1中所有行的“实时”显示,其中列N等于指定值 非常感谢您的帮助 funct

好的,这里是完整的新手…我已经搜索并找到了各种“将行复制到另一个工作表”脚本,但只能找到一个。下面是我的博得版本。我想做的是让前页显示第1页中满足三个条件之一的行,即N列的状态为“编辑”、“SB编辑”或“修改编辑”。下面的代码可以做到这一点,但它不会循环,每次我运行它时,它都会重复该操作,我会得到目标工作表上所有行的副本。 基本上,我希望它运行时,当某一行的列N的状态更改为这三个值之一时,它将显示在第2页上。因此,表2是表1中所有行的“实时”显示,其中列N等于指定值

非常感谢您的帮助

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中删除该行?