#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. Большое спасибо за объяснение, в этом действительно больше смысла. Я не знал обо всех компонентах каждой функции, которую я использовал. Я могу подтвердить, что сейчас он работает безупречно !