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