Перебрать все данные, создать объект, вывести, повторить

1

Я создаю скрипт google, который извлекает данные событий из листа google и создает расписание событий на другом листе.

Данные: данные события хранятся в листе google со следующими столбцами: Event Start, Event End, Event Name, Event Role, Event Worker. 6/23/2018 | 6/28/2018 | Holiday Party | Event Manager | Christopher Smith данных на листе обычно выглядит так: 6/23/2018 | 6/28/2018 | Holiday Party | Event Manager | Christopher Smith 6/23/2018 | 6/28/2018 | Holiday Party | Event Manager | Christopher Smith 6/23/2018 | 6/28/2018 | Holiday Party | Event Manager | Christopher Smith.

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

Вопрос: javascript ниже работает очень хорошо; он проверяет все данные, создает объект события, проверяет, является ли он правильным типом события, проверяет дату начала события и сравнивает его с датами расписания событий, а затем вставляет данные в нужное место в расписании событий. Однако он делает это только для последней строки данных. У меня возникают проблемы с тем, как начать работу в верхней части данных, построить первый объект события, вставить эти данные в расписание и затем повторить процесс на следующем событии в данных.

//Event object
var event = {
  id: null,
  start: null,
  end: null,
  workers: [],
};

//Loop through data and get event details      
for (var i = 1; i < dataDates.length; i++) {
  if (dataDates[i][3].indexOf("Manager")) {
    event.id = dataDates[i][0] + dataDates[i][2];
    event.start = dataDates[i][0];
    event.end = dataDates[i][1];
  }
}

//Loop through data and group workers together (grouped by specific event)
for (var ii = 1; ii < dataDates.length; ii++) {
  if (dataDates[ii][0] + dataDates[ii][2] == event.id) {
    event.workers.push(dataDates[ii][4]);
  }
}

//Add the event data to the event schedule sheet   
for (var iii = 1; iii < gridDates.length; iii++) {
  if (gridDates[iii][0] == event.start) {
    grid.getRange(iii + 1, 2, 1).setValue(event.workers);
  }
}
  • 0
    Вы делаете слишком много циклов для того, что, я думаю, вы пытаетесь сделать. Все это может быть сделано элегантно в одной функции, возможно. Тем не менее, не совсем ясно, что именно вы делаете (по крайней мере, для меня).
  • 0
    @Daniel Даниэль Зузевич, спасибо за ваш ответ! Я просто пытаюсь создать календарь событий из электронной таблицы.
Теги:
object
google-apps-script
google-sheets

2 ответа

0

Причина, по которой никто, вероятно, еще не ответил на это, заключается в том, что ваш вопрос, хотя и продуманный аккуратно, не содержит надлежащих подробностей для нас, чтобы помочь вам в адекватной манере. Например, на самом деле то, что вы должны включить, - это образец структуры данных, возвращаемый API Google Таблиц.

Как бы то ни было, он возвращает вам 2D-массив. Может, что-то вроде этого?

var dataDates = [
  ['6/23/2018', '6/28/2018', 'Holiday Party', 'Event Manager', 'Christopher Smith'],
  ['7/23/2018', '7/28/2018', 'Hawaiian Shirt Day', 'Event Manager', 'John Doe']
];

Кит был прав, в том смысле, что вы создаете только один объект события, и вы переписываете этот объект каждый раз, когда вы проходите через свой цикл. Вместо этого вам нужно создать объект для каждой отдельной строки в вашем цикле.

Пока неясно, почему вы делаете так много циклов, и почему вы не можете достичь всего этого внутри одного цикла, но я помогу вам на правильном пути, и, надеюсь, мы сможем уточнить этот ответ, пока вы в конечном итоге его не разрешите, Имейте в виду, что я предлагаю не эффективный алгоритм, но, как я уже сказал, я все еще не вижу точно, что вам нужно делать.

Начало решения. Вместо создания одного объекта события, создайте новый для каждого отдельного прохода через цикл initial for, например:

var dataDates = [
  ['6/23/2018', '6/28/2018', 'Holiday Party', 'Event Manager', 'Christopher Smith'],
  ['7/23/2018', '7/28/2018', 'Hawaiian Shirt Day', 'Event Manager', 'John Doe']
];

// We will store all the dynamically created event objects in this array
var allEvents = [];

// Loop through each row and create an object on the fly, and push it to allEvents
for(var i = 0; i < dataDates.length; i++) {
  var event = {
    id: null,
    start: null,
    end: null,
    workers: []
  };

  if(dataDates[i][3].indexOf('Manager')) {
    event.id = dataDates[i][0] + dataDates[i][2];
    event.start = dataDates[i][0];
    event.end = dataDates[i][1];
  }

  allEvents.push(event);
}

Обратите внимание, как я создаю пустой массив вне цикла с именем allEvents. Это будет хранить все ваши вновь созданные объекты событий внутри цикла for. После завершения первого цикла цикла, выполните другой цикл for, который выполняет итерацию через allEvents:

for(var i = 0; i < allEvents.length; i++) {
   if(dataDates[i][0] + dataDates[i][2] == allEvents[i].id) {
     allEvents[i].workers.push(dataDates[i][4]);
   }
}

Что это будет делать, это обновить массив allEvents, чтобы теперь включить правильного рабочего внутри каждого объекта.

Дополнительные комментарии Опять же, я не уверен, почему вы не можете сделать все это в одном цикле,

  • Создайте объект события для каждой строки С включенными рабочими (нет необходимости во втором цикле)
  • Добавить этот объект события в новый лист Google

Надеюсь, вы можете прокомментировать этот ответ и уточнить, почему вы считаете, что вам нужно несколько циклов.

PS Ваш третий цикл for ссылается на массив gridDates, о котором вы нам не рассказывали, или не предоставляет подробные сведения о том, что он может содержать.

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

Я включил рабочий Codepen для вас, чтобы проверить некоторые из идей, упомянутых выше.

0

Предполагая, что я правильно понимаю ваш вопрос, я думаю, что проблема заключается в том, что у вас только один объект события, и ваш первый цикл for просто просматривает каждую строку в ваших данных и постоянно переназначает значения ключей id, start и end в этом событии. В конце этого цикла у вас есть один объект, где ключи id, start и end содержат только значения из последней строки в ваших данных. Это значит, что ваши условные операторы во 2-й и 3-й петлях не имеют желаемого эффекта, потому что они реагируют только на один объект события, содержащий только данные из вашей последней строки.

  • 0
    Я полностью осознаю проблему. Я надеялся на помощь с решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню