Как сделать автозаполнение ячейки с помощью проверки данных без изменения всей строки на листе Google?

#google-apps-script #google-sheets

Вопрос:

Я автоматизирую процесс назначения в своей компании и успешно внедряю некоторые сценарии Google с триггером времени. Всякий раз, когда кто-то записывается на прием по календарю, он создает строку с несколькими сведениями через Zapier. Затем у меня есть скрипт с несколькими функциями, который работает с только что добавленными строками. Одна функция автоматически сортирует новую строку на основе столбца даты, затем две другие функции заполняют два столбца флажком(FALSE) и проверкой данных на основе списка выбора. Все эти функции запускаются по времени, скажем, через 30 минут. Проблема в том, что всякий раз, когда срабатывает триггер, он автоматически устанавливает флажок в значение TRUE для всего столбца и для первого выбора списка для всего столбца проверки данных. Как я могу это решить ?

 
var SORT_COLUMN_INDEX = 4;
var ASCENDING = true;
var NUMBER_OF_HEADER_ROWS = 1;
var activeSheet;

function autoSort() {
  console.log(sheet, activeSheet)
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var range = sheet.getDataRange();

  if (NUMBER_OF_HEADER_ROWS > 0) {
    range = range.offset(NUMBER_OF_HEADER_ROWS, 0);
  }
  range.sort( {
    column: SORT_COLUMN_INDEX,
    ascending: ASCENDING
  } );
}
// Fonction to automatically add data validation in column K
function setDataValidationComing() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var listOfChoices = ["Coming","Not Coming","Message Left", "Unreachable"]
var validation = SpreadsheetApp.newDataValidation().requireValueInList(listOfChoices).build();;
  sheet.getRange("K2").setDataValidation(validation);

var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 11, lr-1);
sheet.getRange("K2").copyTo(fillDownRange);
}

// Fonction to automatically add checkbox for appointment honored in column L
function setCheckboxCame() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var validation = SpreadsheetApp.newDataValidation().requireCheckbox().build();
  sheet.getRange("L2").setDataValidation(validation);

var lr = sheet.getLastRow();
var fillDownRange = sheet.getRange(2, 12, lr-1);
sheet.getRange("L2").copyTo(fillDownRange);
}
 

Вот скриншот страницы Google. Скриншот Google листа

Спасибо за вашу помощь, я только неделю назад начал использовать Google Скрипт !

Ответ №1:

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

На самом деле это не проверка на истинность для всего столбца. Это копирование значения первой строки после заголовка и применение этого значения к каждому флажку в столбце. Первая строка данных показывает «Поступление», поэтому, если вы запустите этот сценарий, он будет применяться ко всем из них. Если вы измените его на «Не придет», он будет применяться «Не придет» к каждой строке. Это из-за этой строки:
sheet.getRange("K2").copyTo(fillDownRange);

Вы не хотите копировать значение K2, вы хотите скопировать только проверку. Так что эта строка действительно должна быть:

 `sheet.getRange("K2").copyTo(fillDownRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);`
 

Что касается флажка, это немного сложнее, но применима та же концепция:

 function setCheckboxCame() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];

    // UPDATED THIS PART
    var validation = SpreadsheetApp.newDataValidation().requireCheckbox();
    validation.setAllowInvalid(false);
    validation.build();

    var lr = sheet.getLastRow();
    var fillDownRange = sheet.getRange(2, 12, lr-1);
    // CHANGE THIS:
    //sheet.getRange("L2").copyTo(fillDownRange);
    // TO THIS: 
    fillDownRange.setDataValidation(validation);

}
 

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

1. Большое спасибо за объяснение, в этом действительно больше смысла. Я не знал обо всех компонентах каждой функции, которую я использовал. Я могу подтвердить, что сейчас он работает безупречно !