В Google Spreadsheet с использованием скрипта, как принудительно сбросить ввод пользователя?
Мне было интересно, можно ли принудительно сбросить пользовательский ввод из скрипта.
Контекст следующий: у меня есть лист, на котором люди должны вводить данные, и кнопка, по которой они нажимают, когда они закончат, чтобы обработать данные.
Бывает, что иногда люди дважды щелкают по ячейке, пишут, что хотят, но затем они нажимают кнопку, прежде чем нажать кнопку возврата. Таким образом, скрипт видит ячейку как пустую.
Будет ли способ принудительно заполнить то, что они в настоящее время набрали, или обнаружить, что ячейка в данный момент редактируется?
Ура,
Виктор
7 ответов
Ячейка никогда не "редактируется", пока они не нажмут клавишу ввода или не выберут другую ячейку. Таким образом, вы можете поручить им щелкнуть по другой ячейке или нажать клавишу ввода, прежде чем нажимать кнопку. Я понимаю, что это не лучшее решение. Но нет способа определить, что пользователь собирается ввести в ячейку.
Вы можете сделать это опцией меню, которую они нажимают. Нажатие на элемент меню (см. AddMenu) записывает текст в электронную таблицу, чтобы вы могли прочитать его, когда они используют функцию своего меню. Опять же, это может быть не лучшим решением, но, тем не менее, это решение.
Как вы обнаружили, использование изображения в качестве кнопки, которую следует нажимать после того, как пользователь ввел значение в ячейку, не приводит к фактическому вводу значения.
Способ заставить ячейку изменить свое состояние с "режима входа" на "режим отображения":
- давящий Enter
- давящий Tab
- нажатие сочетания клавиш (я еще не тестировал)
- щелчок по другой ячейке или меню (включая настраиваемое меню)
Обходной путь может заключаться в замене "кнопки" на
- Пользовательский пункт меню
- Кнопка на боковой панели или диалоговое окно без модального окна
- Триггер редактирования, простой или устанавливаемый
Если вы заставите приложение активировать эту ячейку, вы можете получить новое значение в памяти, например:
var mycell = sheet.getActiveSelection();
var cellcol = mycell.getColumn() ;
var cellrow = mycell.getRow();
sheet.setActiveCell(sheet.getDataRange().offset(0, 0,cellcol, cellrow));
Я была такая же проблема. Решение, которое сработало для меня: в сценарии, который запускается кнопкой, я добавил некоторый код, который активирует другой лист в электронной таблице:
function buttonScript() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('A_DIFFERENT_SHEET'), true);
// REST OF THE CODE in your script
}
Очевидно, это заставляет пользовательский ввод "вводиться" в ячейку.
Решение вопроса OP (сделать кнопку имитирующей ENTER) состоит в том, чтобы прикрепить этот код к кнопке:
function button_search_client() {
let mySheet = SpreadsheetApp.getActiveSpreadsheet()
mySheet.setActiveSheet(mySheet.getSheetByName("Clients"))
mySheet.setActiveSheet(mySheet.getSheetByName("Form"))
return true
}
... в котором "Форма" содержит кнопку, а "Клиенты" - любой другой лист.
Спустя 6 лет после этого спросили, но, к счастью, у меня возникла та же проблема, и я попробовал все варианты. Как и комментарии, иногда это работает, а иногда нет.
Поэтому я просто сделал оператор if else, чтобы убедиться, что все записи не пустые, и только затем запустить код.
function move() {
var source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PROCESS');
var source_range = source.getRange(3, 15, 1, 6).getValues();
var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SUBMISSIONS');
var target_range = target.getRange(target.getLastRow() + 1, 2, 1, 6);
var check = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('INPUT');
var check_order = check.getRange(7, 15, 1, 1);
var check_firstname = check.getRange(9, 15, 1, 1);
var check_lastname = check.getRange(11, 15, 1, 1);
var check_email = check.getRange(13, 15, 1, 1);
if (check_order.getValue() === '' ) {
Browser.msgBox('Error','Please make sure all fields are filled.', Browser.Buttons.OK);
} else if ( check_firstname.getValue() === '' ) {
Browser.msgBox('Error','Please make sure all fields are filled.', Browser.Buttons.OK);
} else if ( check_lastname.getValue() === '' ) {
Browser.msgBox('Error','Please make sure all fields are filled.', Browser.Buttons.OK);
} else if ( check_email.getValue() === '' ) {
Browser.msgBox('Error','Please make sure all fields are filled.', Browser.Buttons.OK);
} else {
target_range.setValues(source_range);
var datecell = target_range.offset(0, -1, 1, 1);
datecell.setValue(new Date()).setNumberFormat('YY-MM-DD HH:mm:ss');
var clearsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('INPUT');
clearsheet.getRange("J3:K4").clearContent();
clearsheet.getRange("B8:B25").clearContent();
clearsheet.getRange("H8:H9").clearContent();
clearsheet.getRange("H11").clearContent();
clearsheet.getRange("O7:P16").clearContent();
}
}
Работает отлично. Еще лучше, вы можете настроить .msgBox
сослаться на ошибку, и еще одно, если все хорошо - сказать, что было представлено.
редактировать: декабрь 2021 г.
Чтобы решить эту проблему, замените кнопку пользовательским меню. Например
function onOpen() {
SpreadsheetApp.getUi().createMenu(' Menu ')
.addItem(' valid', 'valider')
.addToUi();
}
function valider(){
var sheet=SpreadsheetApp.getActiveSheet()
Browser.msgBox(sheet.getRange('D9').getValue())
}