Автоматически увеличивающийся идентификатор Google Sheet / основная клавиша

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

В этой функции Google Sheet первичный ключ автоматически добавляется в первый столбец при изменении. Проблема с этой функцией заключается в том, что при добавлении новой строки строка ниже также получает первичный ключ, несмотря на то, что другие ячейки в строке пусты.

Как можно изменить эту функцию, чтобы добавлялся только первичный ключ, если, например, первая ячейка справа (ячейка B) не пуста?

 function myFunction() {

  var AUTOINC_COLUMN = 0;
  var HEADER_ROW_COUNT = 1;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet   = spreadsheet.getSheetByName("Sheet1");
  var rows        = worksheet.getDataRange().getNumRows();
  var vals        = worksheet.getSheetValues(1, 1, rows 1, 2);

  for (var row = HEADER_ROW_COUNT; row < vals.length; row  ) {
    try {
      var id = vals[row][AUTOINC_COLUMN];
      Logger.log(id);Logger.log(("" id).length ===0);
      if (("" id).length === 0) {
        // Here the columns amp; rows are 1-indexed
        worksheet.getRange(row 1, AUTOINC_COLUMN 1).setValue(row);
      }
    } catch(ex) {
      // Keep calm and carry on
    }
  }
}
  

Комментарии:

1. Ваша проблема не ясна. Вы не предоставили достаточно информации. первичный ключ автоматически добавляется в первый столбец при изменении Что это значит? Вы также не указываете, являются ли ваши данные числовыми или текстовыми. Было бы полезно иметь копию вашей электронной таблицы. Однако, как удар в темноте, попробуйте это: добавьте переменную после id: var col2 = vals[row][1]; , затем используйте эту новую строку для их оценки if(id.length !=0 amp;amp; col2.length!=0){ . Итак, если id НЕ пуст, А col2 НЕ пуст, вы можете добавить ключ. если какое-либо значение является строкой, то просто измените на id.toString().length и т.д.

Ответ №1:

Я бы не стал использовать скрипт для этого, просто введите это в A2, а затем скопируйте полностью. поместите 0 (или 100, где бы вы ни хотели, чтобы он начинался) в ячейку A1.

 =if(B2="","",A1 1)
  

Комментарии:

1. Просто и идеально. Спасибо

2. Если предыдущая строка была удалена, это приведет к ошибке ссылки

3. Это также не сработает, если вам нужно иметь возможность сортировать данные. Каждый отдельный порядок сортировки будет иметь разные первичные ключи.

Ответ №2:

Просто подумал, что я бы добавил свой ответ. Я бы не стал использовать формулу, потому что это приведет к пересчету, если вы когда-либо отсортируете лист (нехорошо, если вы ссылаетесь на первичные ключи в другом месте). Другое решение на основе кода предполагает, что записи будут добавлены только в конце листа, а последняя строка — это самый высокий первичный ключ (т. Е. В конечном итоге будут дубликаты ключей, если вы когда-либо воспользуетесь листом).

Этот код будет работать независимо от того, куда вы вставляете запись или как вы сортируете данные. Предполагается, что вы никогда не удалите строку с наивысшим первичным ключом (удаление строки с меньшим, чем самый высокий первичный ключ, не будет проблемой).

 function auto_increment_column() {
  const AUTO_INCREMENT_SHEET = "Sheet1";

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AUTO_INCREMENT_SHEET);

  var nextIncrementValue = Math.max.apply(Math, sheet.getRange("A:A").getValues().flat().filter(e => !isNaN(parseFloat(e))))

  var rows = sheet.getRange("A:B");

  for(var i = 1; i <= rows.getNumRows(); i  ) {
    var cellA = rows.getCell(i, 1);
    var cellB = rows.getCell(i, 2);

    if(cellA.getValue() === "" amp;amp; cellB.getValue() !== "") {
      cellA.setValue(nextIncrementValue  );
    }
  }
}
  

Комментарии:

1. Кажется, это именно то, что я ищу, но я не понимаю, как сделать эту функцию доступной в моем листе. Я создал проект Apps Script и добавил код … но документация Google оставила меня озадаченным оттуда. Приветствуются любые рекомендации!

2. Есть несколько способов сделать это. Вы можете настроить устанавливаемый триггер при редактировании из вашего проекта для запуска этой функции в любое время, когда редактируется электронная таблица, используйте простой триггер onEdit (иногда он может быть сложным, поскольку для этого требуется, чтобы пользователь редактирования авторизовал сценарий), настройте пункт меню с помощью триггера при загрузке (вам придется запускать функцию из меню. Это не будет автоматически при редактировании листа), или, наконец, вы можете запустить код с экрана проекта (это, безусловно, наименее удобно).

Ответ №3:

Формула
=ARRAYFORMULA(sequence(match(2,1/(B:B<>""),1),1,0,1))
введенный в ячейку A1, автоматически увеличит столбец A до последней ячейки в столбце B, содержащей некоторое значение.

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

Приведенная выше формула управляет строками, столбцами, начальным значением и значением шага. Дополнительная информация:infoinspired.com

Примечание: Используя формулу, такую как
=if(C2="","","value if false") для вставки значения ячейки в столбец B всегда будет учитываться.
Оба " " и "value if false" вычисляют ячейку с чем-то в ней.
Использование » » для обозначения пустого или empty неверно.
Попробуйте вместо этого =if(C2="",,"value if false") избежать неожиданных результатов в функциях и формулах.

Ответ №4:

Что-то вроде этого может быть тем, что вы ищете:

 function auto_increment_col() {
  var AUTOINC_COLUMN = 1;
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet   = spreadsheet.getActiveSheet();
  var last_row        = worksheet.getLastRow();
  var last_inc_val = worksheet.getRange(last_row, AUTOINC_COLUMN).getValue();

  //if auto_inc column is blank and the column next to auto_inc column is not blank, then assume its a new row
  var is_new_row = last_inc_val == "" amp;amp; worksheet.getRange(last_row, AUTOINC_COLUMN 1).getValue() != "";
  Logger.log("new_row:"   is_new_row   ", last_inc_val:"   last_inc_val );
  if (is_new_row) {
    var prev_inc_val = worksheet.getRange(last_row-1, AUTOINC_COLUMN).getValue();
    worksheet.getRange(last_row, AUTOINC_COLUMN).setValue(prev_inc_val 1);
  }
}