1

Я хочу создать своего рода «стек», и каждый раз, когда я удаляю элемент, лист удаляет пустые ячейки. Очевидно, я не могу использовать функцию фильтра.Проблема с 2D-матрицей?

У меня возникли проблемы с чтением массива, созданного для этой цели.

Мой очень псевдокод: я создаю пустой массив, получаю все значения (включая пустые), заполняю мой массив всеми значениями, кроме пустых, и, наконец, очищает стек и устанавливает значения с помощью моего массив.

Вот мой код:

function updateStack() { 
 
    
 
var ss = SpreadsheetApp.getActive(); 
 
var sheet = ss.getSheetByName("main"); 
 
    
 
var zone = sheet.getRange(1, 1, 1, 10); 
 
    
 
    //seems that .getValues() returns a 2d array 
 

 
var values = zone.getValues(); 
 
var j = 0; 
 
    
 
var data = new Array(); 
 
    
 
    for (var i = 0 ; i < 10 ; i++) { 
 

 
    //the problem seems to be here : I can't access the 2d array. After reading the debugging console about 1000 thousand times 
 
    // I discovered the 2 pairs of [] 
 
    
 
    //I've found multiple ways to detect empty cells. Not sure if this is the right one. I've tried the .length = 0 trick, but something 
 
    // was wrong, maybe because of the "2dimensionality" 
 

 
    
 
    if (values[i] != "") { 
 
     
 
     data[j] = values[i]; 
 
     j = j++; 
 
     
 
    } else { 
 
     
 
     // do nothing if the cell contains nothing 
 
     
 
    } 
 
    
 
    //not sure if I have to use return ! Don't know where to put it exactly too... 
 
    return data; 
 
    zone.clear(); 
 
    //length of range must be the same as the array's length 
 
    
 
    zone = sheet.getRange(1, 1, 1, data.length); 
 
    zone.setValues(data); 
 
    } 
 
}

Есть много комментариев в моем коде, я надеюсь, вы поймете. Ссылка на мой лист: http://bit.ly/1JiWutn

Благодарим за любую помощь!

+0

Я понял это до тех пор, пока вы не упомянете о снятии пустых ячеек ... Возможно, вы захотите включить некоторый промежуточный шаг/информацию. –

+0

Спасибо, что указали это. Я отредактировал его, надеюсь, теперь это яснее. –

ответ

1

В настоящее время у вас есть часть кода, как это:

if (values[i] != "") { 

    data[j] = values[i]; 
    j = j++; 

} else { 

Вы проверяете для пустой строки:

values[i] != "" 

values[i] Но это внутренний массив. Ваш код получает только одну строку и 10 столбцов.

var zone = sheet.getRange(1, 1, 1, 10); 

Таким образом, массив выглядит следующим образом:

[ [cell one,cell two,cell three,etc,cell ten ] ] 

values[i] возвращает внутренний массив, а не значение.

Чтобы использовать значение ячейки:

if (values[0][i] != "") { 

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

Далее используйте push добавить значение в data массива:

data.push(values[0][i]); 

Другой вопрос, где у вас есть return заявление. Оператор return убивает текущую функцию. Все, что после инструкции return внутри этой функции не будет выполняться. Таким образом, вы не можете иметь оператор возврата, где у вас есть, и получить код для записи значений в электронную таблицу. Вы можете сделать то и другое. Вы можете записывать значения на листе и возвращать что-то, но верните результат в конце. Возврат возвращает что-то в любую функцию, называемую этой функцией.

Для установки значений значения ДОЛЖНЫ быть в двухмерном массиве. Ваш массив data не является двумерным массивом. Вы должны добавить массив data в еще один массив.

var my2Darray = []; 
my2Darray.push(data); 

zone = sheet.getRange(1, 1, 1, data.length); 
zone.setValues(my2Darray); 
+0

Спасибо. Я изменил код, но он не работает. Я не уверен в двойном индексе, потому что консоль отладки дала мне [["987sdf987", 987, 987, "", 4654, 7, 987987, "", "", ""]] и что заставляет меня думать: это массив с внутренним массивом внутри. Поэтому, если я хочу получить доступ к элементу в нем, это будут данные [0] [i]. –

+0

О, да, моя ошибка. Извини за это. Я обновил свой ответ. –

+1

Добро пожаловать, я очень горжусь, я указал на это, это первый сценарий моей жизни! По-прежнему возникают проблемы с «возвратом»: куда его поставить? Если я опускаю это, говорит, что невозможно преобразовать массив в объект, и если я его положу, он очистит мой стек, но не напишет мои значения. –

0

Если вы тестируете только пустые ячейки по всей строке, то тест, который у вас есть, практически применим.Если вы соедините все значения в этом массиве, результат можно сравнить с "".

// join all the values with nothing between them 
// compare the result to empty string 
if(values[i].join("") !== "") { 

    // if at least one cell contained something 
    data.push(values[i]); // Stackius Popularious 


} 
+0

Я неправильно понял вопрос - я предположил, что диапазон был двумерным, состоящим из строк и столбцов - на самом деле это одна строка с только столбцами – Jonathon

Смежные вопросы