#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);
}
}