2

我想知道是否可以从脚本强制刷新用户输入。

上下文如下:我有一张人们应该在其中输入数据的工作表,以及一个他们在完成后单击的按钮,它将处理数据。

有时人们会双击一个单元格,写下他们想要的内容,然后他们在点击返回之前点击了按钮。因此,脚本将单元格视为仍为空。

是否有一种方法可以强制刷新他们当前键入的内容,或者检测到当前正在编辑单元格?

4

6 回答 6

2

在他们按下回车键或选择另一个单元格之前,该单元格永远不会“编辑”。因此,您可以指示他们单击另一个单元格,或者在单击按钮之前按 enter。我知道这不是最好的解决方案。但是没有办法检测到用户将要在单元格中输入什么。

您可以将其设置为他们单击的菜单选项。单击菜单项(请参阅addMenu)会将文本写入电子表格,以便您在他们使用菜单功能时能够阅读它。同样,这可能不是最好的解决方案,但它仍然是一个解决方案。

于 2013-03-11T17:44:32.673 回答
1

正如您所发现的,在用户将值输入单元格后,使用图像充当应单击的按钮不会强制实际输入值。

强制单元格将其状态从“进入模式”更改为“显示模式”的方法是

  • 紧迫Enter
  • 紧迫Tab
  • 按键盘快捷键(我还没有测试过)
  • 单击另一个单元格或菜单(包括自定义菜单)

一种解决方法可能是将您的“按钮”替换为

  • 自定义菜单项
  • 侧边栏中的按钮或无模式对话框
  • 编辑触发器,简单或可安装
于 2020-02-09T17:22:28.830 回答
0

如果您强制应用程序激活此单元格,您可以将新值存储到内存中,例如:

var mycell = sheet.getActiveSelection();  
var cellcol = mycell.getColumn() ;
var cellrow = mycell.getRow();

sheet.setActiveCell(sheet.getDataRange().offset(0, 0,cellcol, cellrow)); 
于 2016-05-17T12:48:46.637 回答
0

我遇到过同样的问题。对我有用的解决方案:在按钮触发的脚本中,我预先添加了一些代码来激活电子表格中的另一个工作表:

  function buttonScript() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('A_DIFFERENT_SHEET'), true);
  // REST OF THE CODE in your script
  }

显然,这会强制用户输入在单元格中“输入”。

于 2018-09-21T10:25:43.893 回答
0

在被问到这个问题 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以引用错误,如果一切顺利,您还可以自定义 —— 说明提交的内容。

于 2019-03-22T15:20:05.793 回答
0

编辑:2021 年 12 月

要解决此问题,请将按钮替换为自定义菜单。例如

function onOpen() {
  SpreadsheetApp.getUi().createMenu(' Menu ')
    .addItem(' valid', 'valider')
    .addToUi();
}
function valider(){
  var sheet=SpreadsheetApp.getActiveSheet()    
  Browser.msgBox(sheet.getRange('D9').getValue())
}

在此处输入图像描述

于 2021-12-19T11:05:28.790 回答