Как мне прочитать данные в одной ячейке и записать данные в другую ячейку с помощью Google Sheets? - PullRequest
0 голосов
/ 16 октября 2019

Итак, давайте предположим, что столбец B заполнен несколькими короткими операторами. Эти операторы могут использоваться более одного раза, а не вообще или только один раз в столбце. Я хочу иметь возможность прочитать, что находится в каждой ячейке столбца B, и назначить ей категорию в столбце F с помощью редактора сценариев Google Sheets. Я включу некоторый псевдокод того, как я обычно делаю что-то подобное.

for (var i = 0; i < statements.length; i++) {
  if (statements[i] == 'Description One') {
     category[i] = 'Category One';
  }
  else if (statements[i] == 'Description Two') {
     category[i] = 'Category Two';
  }
  // and so on for all known categories....
}

Как мне получить доступ к ячейке для чтения и получить доступ к другой ячейке для записи?

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Предполагая лист, такой как этот один, который имеет заголовок и шесть различных столбцов (где B - описание, а F - категория);Вы можете использовать словарь для перевода своих значений следующим образом:

// (description -> category) dictionary
var translations = {
  "cooking": "Cooking",
  "sports": "Sport",
  "leisure": "Leisure",
  "music": "Music",
  "others": "Other"
}

function assignCategories() {
  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  for (var i=2; i<=dataRange.getNumRows(); i++) {
    var description = dataRange.getCell(i, 2).getValue();
    var category = translations[description];
    dataRange.getCell(i, 6).setValue(category);
  }
}

В случае, если вам нужно дополнительное постановление (т. е. описания, которые содержат крикет должен быть классифицирован как спорт), вы можете выполнить свойжелаемых результатов путем реализации собственной пользовательской функции и использования строковых функций (таких как indexOf ) или регулярных выражений .

Использование indexOf

// (description -> category) dictionary
var translations = {
  "cooking": "Cooking",
  "sports": "Sport",
  "leisure": "Leisure",
  "music": "Music",
  "others": "Other"
}

function assignCategories() {
  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  for (var i=2; i<=dataRange.getNumRows(); i++) {
    var description = dataRange.getCell(i, 2).getValue()
    var category = assignCategory(description);
    if (category) dataRange.getCell(i, 6).setValue(category);
  }
}

function assignCategory(description) {
  description = description.toLowerCase();
  var keys = Object.keys(translations);
  for (var i=0; i<categories.length; i++) {
    var currentKey = keys[i];
    if (description.indexOf(currentKey) > -1)
      return translations[currentKey];
  }
}

Эта версия немного сложнее. Он будет составлять «описание» каждой строки в нижнем регистре для лучшего сравнения с вашим словарем, а также использует indexOf для проверки того, появляется ли «ключ перевода» в описании, а не для точного соответствия.

* 1018Однако вы должны знать, что этот метод будет значительно медленнее, и что сценарий может прерваться (см. GAS Quotas ). Вы могли бы реализовать способы «возобновить» операции скрипта, чтобы вы могли перезапустить его и продолжить с того места, на котором он остановился, в случае, если это мешает вашим операциям.
0 голосов
/ 16 октября 2019

Хорошо, поэтому, немного подумав об этом, я пришел к решению. Это очень просто, хотя и утомительно

function assignCategory(description) {
  if (description == 'Description One') {
    return 'Category One';
  }
  // and so on for all known categories
}

Надеюсь, кто-нибудь увидит это и все равно поможет, если вы, ребята, подумали о более эффективном и более простом способе сделать это, во что бы то ни стало вмешайтесь.

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