#javascript #arrays #google-apps-script #arraylist #multidimensional-array
Вопрос:
Я разрабатываю инструмент, и в настоящее время я столкнулся с проблемой. Я пишу код в GoogleAppScript (JavaScript), и у меня есть два столбца, в которых я собираю данные. В результате у меня есть два массива. Давайте позвоним им mainArray
и checkArray
Мне нужен код, выполняющий эту логику:
- получение 1-го значения основного массива, т. е. основного массива[0]
- проверка значения, если оно равно checkArray[0], затем checkArray[1]… checkArray[i]
- если есть совпадение, то выбросьте его в мусорное ведро и перейдите в основной массив[1].
- Проверка MainArray[1] со всеми значениями из checkArray, как мы это сделали на стр. 2
- Если нет совпадения с какими-либо значениями из контрольного массива, добавьте эти значения в 3-й массив (finArray).
Я поступил как раз наоборот.
for (var j=0; j<checkArr.length; j ) {
for(var i=0; i<mainArr.length; i ) {
if(mainArr[i][0]!==''){
if(checkArr[j][0]==mainArr[i][0])
{
Logger.log('not in the list' mainArr[i][0])
finArr.push(mainArr[i][0])
break;
}}
Но я не знаю, как заставить код работать так, как я описал выше.
Комментарии:
1. см.:
Array#filter()
, но похоже, что у вашегоmain
иcheck
массива есть вложенные массивы? Разместите образцы каждого массива для получения более конкретных ответов.2. когда вы собираете данные из электронной таблицы в Google с помощью .getValues, вы получаете формат [[v1], [v2]]. const a = [‘a’, ‘b’, ‘c’]; const b = [‘c’, ‘a’, ‘d’]; пусть c = a.фильтр(word => b); После запуска кода, проверяющего массив a — мне нужно получить только значение «b», потому что у меня нет » b » во втором массиве
3.
const c = a.filter(word => !b.includes(word));
4.
getValues()
вернет ли 2D массив, вы уверены, что пример с простыми массивамиa
иb
соответствует вашей текущей ситуации?
Ответ №1:
`
// The Arrays actually are one dimensional
// I prefer to create a one dimensional array
// GetDataArray function creates one dimensional array
function GetDataArray(sht,rng) {
var Data = [] var i = 0;
Logger.log(' Sht Name %sn rng %s,', sht.getName(), rng)
sht.getRange(rng).getValues() .forEach(
function (row) {
row.forEach( function (cell) {
//Logger.log(cell);
Data[i ] = cell }); } );
return Data
} //
......
var sht = SpreadsheetApp.getActiveSheet()
var rngMain = ....// Provide the range
var rngCheck = ...
var checkArr = GetDataArray(sht, rngCheck)
var mainArr = GetDataArray(sht, rngMain)
var finArr = []
mainArr.forEach( function(cell) {
if (cell == '') continue
if (checkArr.indexOf(cell) != -1) finArr.push(cell)})
Ответ №2:
function thefunc() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
let vs1 = sh.getRange(1,1,sh.getLastRow(),1).getValues().flat();
let vs2 = sh.getRange(1,2,sh.getLastRow(),1).getValues().flat();
let d = 0;
vs1.forEach((r,i) => {
if(~vs2.indexOf(r[0])) {
sh.deleteRow(i 1-d );//delete row
}
});
}