Самый эффективный способ получить диапазон столбцов в одномерный массив - PullRequest
0 голосов
/ 28 июня 2018

У меня есть форма Google, которая собирает ответы в связанной электронной таблице. Одно из полей формы - Username (столбец B на листе). Я пишу сценарий, чтобы уведомить меня, когда новый пользователь (уникальное имя пользователя) делает заявку. Для этого я:

  1. Получить все значения в столбце B, кроме самого последнего
  2. Получить последнее имя пользователя
  3. Проверьте, есть ли в списке значений последнее имя пользователя (если что-то не так).

Вот что у меня так далеко:

function isUserNew() {
  var spreadsheet = SpreadsheetApp.openById("INSERT ID HERE");
  var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
  var last_row_number = sheet.getLastRow()
  var penultimate_row_number = (last_row_number-1)
  var latest_username = sheet.getRange(last_row_number, 2).getValue()
  var usernames = sheet.getRange("B2:B" + penultimate_row_number).getValues();
}

Это дает мне двумерный массив usernames, который выглядит как [[UserA],[UserB],[UserC],[UserC],[UserA],[UserX]]. Затем я попытался if (usernames.indexOf(latest_username) == -1, но это не работает - это работает только для одномерного массива. Я думал о преобразовании массива в 1D с помощью цикла:

  for (var i = 0; i < usernames.length; i++) {
    Logger.log(usernames[i][0]);
  }

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

2 основных вопроса:

  1. Как получить значения в массив вместо Logger?
  2. Это лучший способ сделать то, что я пытаюсь сделать? Кажется ненужным, чтобы при каждой отправке я брал двумерный массив, конвертировал в 1D и сравнивал. Данные столбца не собираются меняться, они только увеличиваются на 1 каждый раз. Как это повлияет на время выполнения, когда данные вырастут в тысячи?

1 Ответ

0 голосов
/ 28 июня 2018

Да, вы можете сгладить массив и сравнить с indexOf, как вы делаете:

var flattened_usernames = [] ;
for (var i = 0; i < usernames.length; i++) {
    flattened_usernames.push(usernames[i][0]);
}

Но вам лучше просто выполнить проверку внутри цикла:

if (usernames[i][0] === latest_username)

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

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