【问题标题】:How to force flush a user's input?如何强制刷新用户的输入?
【发布时间】:2013-02-26 22:52:30
【问题描述】:

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

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

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

是否有办法强制刷新他们当前输入的内容,或检测当前正在编辑的单元格?

【问题讨论】:

  • 只是一个想法,但您可以禁用该按钮,直到页面更改。使用 onEdit 函数启用按钮。

标签: google-apps-script google-sheets


【解决方案1】:

编辑:2021 年 12 月

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

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

【讨论】:

    【解决方案2】:

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

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

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

    一种解决方法可能是用

    替换您的“按钮”
    • 自定义菜单项
    • 边栏中的按钮或无模式对话框
    • 编辑触发器,简单或可安装

    【讨论】:

      【解决方案3】:

      在被问到这个问题 6 年后,但幸运的是,我遇到了同样的问题并尝试了每个人的选择。与 cmets 一样,它有时有效,有时无效。

      所以我只是做了一个 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 来引用错误,如果一切正常,还可以自定义另一个 - 说明提交的内容。

      【讨论】:

      • 我在这里看到的问题是,如果您有一堆单元格可供用户输入。您如何判断他们实际上打算将哪些单元格留空?我想您可以检测到最后一行并将其设置为范围的底部...?
      • @Craig.Pearce 好点,在上面的脚本中,用户只能——并且必需——在var check范围内输入,导致if/else验证语句.我不确定.getLastRow() 是否有助于解决这个输入是可选的问题。
      【解决方案4】:

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

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

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

      【讨论】:

      • 这仅在脚本的其余部分不依赖于处于活动状态的原始工作表时才有效。如果您快速切换回原始工作表,无论出于何种原因,它都会写入数据。
      【解决方案5】:

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

      var mycell = sheet.getActiveSelection();  
      var cellcol = mycell.getColumn() ;
      var cellrow = mycell.getRow();
      
      sheet.setActiveCell(sheet.getDataRange().offset(0, 0,cellcol, cellrow)); 
      

      【讨论】:

      • 给定的提案在任何时候都无效,只是有时有效!
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 1970-01-01
        • 2020-01-04
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多