Скопируйте определенную строку в новую таблицу Google на основе значения в ячейке строки (JavaScript)

#javascript #google-apps-script

#javascript #google-apps-script

Вопрос:

Я пытаюсь создать скрипт Google, который копирует строки из одного листа Google в другой на основе значения ячейки.

Я бы хотел, чтобы скрипт запустился и проверил столбец «H» на наличие слова «готово», и если он найден, скопируйте эту строку данных в следующую пустую строку на другом листе.

Я пробовал разные подходы, но все еще чего-то не хватает. Он всегда переходит в «else», поэтому я предполагаю, что проблема в var data = range.getValues();

 function transfer1() {

    var ss = SpreadsheetApp.getActive();
    var sheet1test = ss.getSheetByName("Sheet1test");
    var dbtest = ss.getSheetByName("dbtest2");


    var dataRange = sheet1test.getDataRange();
    var range = sheet1test.getRange("A2:H"   dataRange.getLastRow());
    var data = range.getValues();

    if ( data == "done" ) { //it seems that "done" is never found in any cell??

        dbtest.getRange(dbtest.getLastRow() 1, 1, data.length, data[0].length).setValues(data);

    } else {

        do nothing

    }
}
  

Я ожидаю копировать только те строки, которые имеют значение «готово». Чего мне не хватает?

Комментарии:

1. getValues возвращает «двумерный массив значений, индексированный по строке, затем по столбцу» doc. Итак, «данные» — это массив, и они никогда не будут «равны» «сделано». Тогда возникает вопрос, какую строку оценивать. Изучите несколько примеров перебора значений, возвращаемых getValues . Кроме того, взгляните на альтернативный getRange(row, column, numRows, numColumns) документ, который содержит хороший пример зацикливания.

Ответ №1:

Попробуйте это:

 function yourfunction() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName("Sheet1");
  var sh2=ss.getSheetByName("Sheet2");
  var rg1=sh1.getRange(1,2,sh1.getLastRow(),7);//starting at column2
  var data=rg1.getValues();
  for(var i=0;i<data.length;i  ) {
    if(data[i][6]=="done") {
      sh2.appendRow(data[i]);
    }
  }
}
  

или это работает для:

 function yourfunction() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName("Sheet1");
  var sh2=ss.getSheetByName("Sheet2");
  var rg1=sh1.getRange(1,2,sh1.getLastRow(),sh1.getLastColumn()-1);//starting at column2
  var data=rg1.getValues();
  for(var i=1;i<data.length;i  ) {
    if(data[i][6]=="done") {
      sh1.getRange(i 1,2,1,sh1.getLastColumn()-1).copyTo(sh2.getRange(sh2.getLastRow() 1,1,1,sh1.getLastColumn()-1));
    }
  }
}
  

или даже это:

 function yourfunction() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName("Sheet1");
  var sh2=ss.getSheetByName("Sheet2");
  var rg1=sh1.getRange(1,2,sh1.getLastRow(),sh1.getLastColumn()-1);//starting at column2
  var data=rg1.getValues();
  for(var i=0;i<data.length;i  ) {
    if(data[i][6]!="done") {
      data.splice(i,1);
    }
  }
  sh2.getRange(sh2.getLastRow() 1,1,data.length,data[0].length).setValues(data);
}
  

на самом деле это довольно интересно:

 function yourfunction() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName("Sheet1");
  var sh2=ss.getSheetByName("Sheet2");
  var rg1=sh1.getDataRange();
  var data=rg1.getValues();
  data.map(function(r){return r.splice(0,1);});
  for(var i=0;i<data.length;i  ) {
    if(data[i][6]!="done") {
      data.splice(i,1);
    }
  }
  sh2.getRange(sh2.getLastRow() 1,1,data.length,data[0].length).setValues(data);
}