我想知道是否可以从脚本强制刷新用户输入。
上下文如下:我有一张人们应该在其中输入数据的工作表,以及一个他们在完成后单击的按钮,它将处理数据。
有时人们会双击一个单元格,写下他们想要的内容,然后他们在点击返回之前点击了按钮。因此,脚本将单元格视为仍为空。
是否有一种方法可以强制刷新他们当前键入的内容,或者检测到当前正在编辑单元格?
我想知道是否可以从脚本强制刷新用户输入。
上下文如下:我有一张人们应该在其中输入数据的工作表,以及一个他们在完成后单击的按钮,它将处理数据。
有时人们会双击一个单元格,写下他们想要的内容,然后他们在点击返回之前点击了按钮。因此,脚本将单元格视为仍为空。
是否有一种方法可以强制刷新他们当前键入的内容,或者检测到当前正在编辑单元格?
在他们按下回车键或选择另一个单元格之前,该单元格永远不会“编辑”。因此,您可以指示他们单击另一个单元格,或者在单击按钮之前按 enter。我知道这不是最好的解决方案。但是没有办法检测到用户将要在单元格中输入什么。
您可以将其设置为他们单击的菜单选项。单击菜单项(请参阅addMenu)会将文本写入电子表格,以便您在他们使用菜单功能时能够阅读它。同样,这可能不是最好的解决方案,但它仍然是一个解决方案。
正如您所发现的,在用户将值输入单元格后,使用图像充当应单击的按钮不会强制实际输入值。
强制单元格将其状态从“进入模式”更改为“显示模式”的方法是
一种解决方法可能是将您的“按钮”替换为
如果您强制应用程序激活此单元格,您可以将新值存储到内存中,例如:
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
}
显然,这会强制用户输入在单元格中“输入”。
在被问到这个问题 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
以引用错误,如果一切顺利,您还可以自定义 —— 说明提交的内容。