如何检查Google电子表格中的特定值

时间:2018-12-16 18:07:30

标签: google-apps-script google-sheets

我在线上选择了此代码,我正在尝试检查B列中的值是否为“完成”,否则将复制该值。这是我正在使用的代码:

下面的复制工作表功能会将数据从源工作表复制到目标工作表,但我希望仅在col B值包含“完成”的情况下才选择行

function copySheet() {
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Source");
  var destSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination");

  var columns_to_be_copied =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'];
  var columns_to_be_pasted =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'];

  for (column in columns_to_be_copied) {
    var copy_range_string = columns_to_be_copied[column] + ':' + columns_to_be_copied[column];
    var paste_range_string = columns_to_be_pasted[column] + ':' + columns_to_be_pasted[column];

    var source = sourceSheet.getRange(copy_range_string);
    var destination  = destSheet.getRange(paste_range_string);
    if(findInColumn('A','Done') !== -1) {
      copyTo(source,destination );
    }
  }
}
function copyTo(source,destination) {
  var sourceSheet = source.getSheet();
  var destSheet = destination.getSheet();
  var sourceData = source.getValues();
  var dest = destSheet.getRange(
      destination.getRow(),        // Top row of destination
      destination.getColumn(),     // left col of destination
      sourceData.length,           // # rows in source
      sourceData[0].length);       // # cols in source (elements in first row)
  dest.setValues(sourceData);
  SpreadsheetApp.flush();
}

function findInColumn(column, data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sprint");
  var column = sheet.getRange(column + ":" + column);  // like A:A

  var values = column.getValues(); 
  var row = 0;

  while (values[row] && values[row][0] !== data) {
    row++;
  }
  if (values[row][0] === data)
    return row+1;
  else 
    return -1;
}

2 个答案:

答案 0 :(得分:0)

它具有相同的功能。我只是对其进行了修改以方便调试过程。如果Sprint的列中有“完成”,它将把列从源复制到目标。

function copySheet() {
  var srcsh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Source");
  var dessh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination");
  var from = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'];
  var to = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'];
  for(var i=0;i<from.length;i++) {
    var fromrg = from[i] + ':' + from[i];
    var torg = to[i] + ':' + to[i];
    var src = srcsh.getRange(fromrg);
    var des  = dessh.getRange(torg);
    if(findInColumn(from[i],'Done')!== -1){
      src.copyTo(des);
    }
  }
}

function findInColumn(col, data) {
  var col=col || 'A';//This is here for initial testing so I could run the function without parameters.
  var data=data || 'Done';
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sprint");
  var rg = sh.getRange(col + "1:" + col + sh.getMaxRows());//MaxRows is kind of big but I was not sure what else you'd like to do and I dont know what your  Sprint sheet looks like.  
  var vA = rg.getValues(); 
  var rv=-1;
  for(var i=0;i<vA.length;i++){
    if(vA[i][0]==data){
      rv=i+1;
      break;
    }
  }
  return rv;
}

我看到您稍微改变了这个问题。当您在答案中显示时,此功能会在sprint工作表中查找,并且仅将在该列的任何行上具有单词“ Done”的列从源复制到目标。但是它会检查您称为“ from”的“ columns_to_be_copied”中的每一列。最初,这就是您的函数要尝试执行的操作。所以我只想弄清楚这个功能在做什么。如果不是您想要的内容,请发表评论,我将其删除。

答案 1 :(得分:0)

由于我是简单易读(即使经过很长时间)解决方案的爱好者,因此建议使用以下脚本:

function main() {
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Source');
  var destinationSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Destination');

  copyFromTo(sourceSheet, destinationSheet);
}

function copyFromTo(sourceSheet, destinationSheet) {
  const ColumnB = 1; //Array indexing starts from 0
  const FilterValue = 'Done';

  var sourceValues = sourceSheet.getSheetValues(1, 1, 100, 28); //startRow, startColumn, numRows, numColumns

  var filteredValues = sourceValues.filter(function(row) {
    return row[ColumnB] === FilterValue;
  });

  destinationSheet.getRange(1, 1, filteredValues.length, filteredValues[0].length).setValues(filteredValues);
}