Как проверить определенное значение в электронной таблице Google - PullRequest
0 голосов
/ 16 декабря 2018

Я выбрал этот код онлайн и пытаюсь проверить, является ли значение в столбце B «Готово», тогда значение будет скопировано, в противном случае - нет.Вот код, который я использую:

Функция копирования листа ниже скопирует данные из исходного листа в лист назначения, но я хочу, чтобы он выбирал только строку, если значение col B содержит Done

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 голосов
/ 17 декабря 2018

Поскольку я фанат простых и легко читаемых (даже после долгого времени) решений, я бы предложил следующий скрипт:

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);
}
0 голосов
/ 16 декабря 2018

Это примерно та же функция.Я просто изменил его, чтобы облегчить процесс отладки.Он копирует столбцы из источника в место назначения, если Sprint имеет «Done» в этом столбце.

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;
}

Я вижу, что вы немного изменили вопрос.Эта функция просматривает ваш спринт-лист, как вы показываете в своем ответе, и копирует из источника в место назначения только те столбцы, которые содержат слово «Готово» в любой строке этого столбца.Но он проверяет каждый столбец в вашем "columns_to_be_copied", который я назвал "от".Первоначально, это то, что ваша функция пыталась сделать.Поэтому я просто хотел уточнить, что делает эта функция.Если это не то, что вы хотите, оставьте комментарий, и я удалю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...