Конкат массив несколько раз в зависимости от значения в массиве. - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь составить небольшой график для повторяющихся задач на моем рабочем месте.Чтобы настроить это, я перебираю свои данные, чтобы найти значение «Ежеквартально» в столбце 2 и «Повторяющееся» в столбце 3.

Если оно находит эти значения, я помещаю данные строки вмассив.Затем я конкатирую массив несколько раз (для этого я использовал другую функцию, не показанную в приведенном ниже коде) на основе 4-го значения в массиве с именем timesrecurring.

Наконец, я копирую массив на другой лист, используя .setvalues ​​().Код ниже:

function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 var sheet = ss.getSheetByName("Input Table"); 
 var targetsheet = ss.getSheetByName("Summary Calendar");
 var lastrow = sheet.getLastRow();
 var datarange = sheet.getRange(8, 2, lastrow-1 , 10).getValues();
 var x = [];

for(i=0; i<datarange.length; i++){

 if (datarange[i][1] == "Recurring" && datarange[i][2] == "Quarterly" ){

  x.push([datarange[i][0],datarange[i][1],datarange[i][2],datarange[i] 
  [3],datarange[i][4],datarange[i][7],datarange[i][8],datarange[i] 
  [9],datarange[i][5],datarange[i][6])


  var timesrecurring = datarange[i][3] 
  var y = replicateArray(x,timesrecurring)

  targetsheet.getRange(targetsheet.getLastRow()+1, 2, 
  y.length,y[0].length).setValues(y);
  }
 }

}

Как вы можете видеть здесь, я ищу строки с "Quarterly" и "Recurring" и вставляю соответствующие строки в массив.Затем я объединяю массив, основываясь на значении timesrecurring.

Сценарий работает хорошо, если в исходной области данных, к которой я применил цикл for, есть только одна строка с «ежеквартально» и «периодически».Однако, как только я добавляю вторую строку, происходит следующее: enter image description here

Предполагается, что будет 6 строк с отчетом FTE по первому столбцу и 3 строки с Ad-hoc.Однако сценарий сначала копирует отчеты FTE из исходных данных 6 раз, а затем - отчеты FTE и Ad-hoc 3 раза (хотя предполагалось, что это будет только 3 раза).Похоже, что во второй раз он хранит как строку для отчетов FTE, так и Ad-hoc в массиве, а не только строку Ad-hoc.

Я попробовал пару вещей, чтобы обойти эту проблему, и посмотрел в Интернете, но я не смог найти ничего, что сработало.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 18 ноября 2018

Вы увеличиваете x с каждым сделанным x.push звонком. Таким образом, если в x содержится четыре разных строки при вызове для репликации, то в результате вы получите 8.

Возможно, вы хотели добавить только конкретную строку datarange к x несколько раз. Вы можете использовать синтаксис push.apply, чтобы избежать необходимости набирать внутренние элементы datarange[i]:

const x = [];
datarange.forEach(function (row, i) {
  if (row[1] === "Recurring" && row[2] === "Quarterly") {
    var timesRepl = row[3];
    for(var n = 0; n < timesRepl; ++n) {
      Array.prototype.push.apply(x, row);
    }
    ... // Do other stuff with a quarterly recurring row
  }
  ...// Do other stuff with any row
});
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...