【问题标题】:When do values get written to a Google Sheet cell?何时将值写入 Google 表格单元格?
【发布时间】:2020-05-24 15:11:39
【问题描述】:

我遇到了一个奇怪的问题。当我在 Google 表格单元格中键入文本,然后运行自定义脚本(如下)以获取这些值时,它不会获取我刚刚输入的值。只有当我离开该单元格时,这些值才可用(@987654322 @ 或 enter)。

var data = dataRange.getValues();

我不确定这些值何时真正写入单元格。如果我编写远离该单元格的脚本(如下),我会遇到同样的问题。

var newRange = sheet.getRange("C4"); sheet.setCurrentCell(newRange);

有没有办法将所有数据写入工作表?

可以使用此代码进行测试。向 A1 写入一些文本,运行自定义脚本并检查日志。如果您在运行脚本之前没有离开 A1,则日志将为空。

function moveTest(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var newRange = sheet.getRange("A2");
  sheet.setCurrentCell(newRange);
  var cellOfInterest = sheet.getRange("A1").getValue();
  Logger.log(cellOfInterest);
}

编辑:setActiveSelectionsetCurrentCell 相同的问题

【问题讨论】:

  • 根据我的经验,它们会在单元格失去焦点时立即写入。因此,当我运行函数 function runOne(){ SpreadsheetApp.getActive().toast(SpreadsheetApp.getCurrentCell().getValue()); } 时,我会立即看到 toast 中的值,因为当我运行函数时单元格失去了焦点。
  • 我最终只是删除了工作表上的“按钮”并将脚本调用放在自定义菜单中。这是一个关于解决问题的方法。我仍然认为谷歌应该实现一种脚本强制将数据写入工作表的方法。我尝试了很多解决方案,但大多数都有非常明显的极端情况,这并不理想。

标签: google-apps-script google-sheets


【解决方案1】:

值何时写入 Google 表格单元格?

当您按 Tab、箭头键、Enter 或任何其他将焦点从单元格移开的方法时,值将被写入或提交。

【讨论】:

  • 有写值的脚本吗?
  • 不确定你在问什么。但是您确实尝试过range.setValues() 对吗?
  • 我的问题实际上是 6 年前这个问题的副本,它更好地描述了这个问题。 stackoverflow.com/questions/15344067/…
  • 使用箭头键也可以写入值,我认为您应该添加这个以完成
  • @Rafa Done
【解决方案2】:

我不确定它是否适合您,但如果您正在检查 1 个确切的单元格,那么在运行脚本之前检查输入是否被识别的 if 语句就可以了:


    function checkwritten(){
      var app = SpreadsheetApp;
      var ss = app.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var ui = SpreadsheetApp.getUi(); 
      var InterestCell = sheet.getRange("A1");
      var cellOfInterest = sheet.getRange("A1").getValue();

      if (InterestCell.isBlank()) {
        Logger.log("missing value");
        ui.alert('There are missing values');
      }
      else {
        Logger.log(cellOfInterest);
        /*
        enter code here
        */
      }
    }

提出的其他解决方案,例如使按钮成为菜单选项,或使按钮变灰直到所有条目都被填满也是可行的。

如果您正在检查范围,以下两个选项是可行的:

选项 1:在您的工作表中创建一个带有 countblank 的单元格,这将是感兴趣的单元格。

function checkwritten(){
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var InterestCell = sheet.getRange("A6");
  var cellOfInterest = sheet.getRange("A6").getValue();

  if (cellOfInterest == 0) {
    Logger.log("success");
  }
  else {
    Logger.log(cellOfInterest);
    /*
    enter code here
    */

  }

}

选项 2 - 允许脚本在运行前确保没有空白单元格。

function checkwritten(){
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var CellCheckCount = 100; // 1 above the total number of rows to check
  var ui = SpreadsheetApp.getUi();
  var BlankCellCount = 0;
  var CheckCell = null;

  for (var i = 1; i < CellCheckCount; i++){
    CheckCell = sheet.getRange(i,1); //currently set to check column 1 up till 100-1 row
    if (CheckCell.isBlank()){
        BlankCellCount++;
        }
    else{
        }
  }

  if (BlankCellCount == 0) {
    Logger.log("success");
    /*
    enter code here
    */
  }
  else {
    Logger.log("fail" + BlankCellCount);
  }
}

【讨论】:

  • 就我而言,它可能是 1 个单元格或 100 个单元格。所以我无法判断用户是否完成了他们的条目。不过感谢您的输入,如果脚本在单个单元格中查找输入,我怀疑您的解决方案会起作用。
  • 嗨 Craig.Pearce 一种选择是使用公式 =isblank(要检查的范围)创建一个单元格。并将脚本从 if (InterestCell.isBlank()) { 更改为 if (cellOfInterest = 0) { 我已将两种可能的解决方案添加到我的答案中。
  • 嗨 Edmund - 感谢更新。我尝试了您的解决方案,它在大多数情况下都有效,除非最后一行是空白行(或尚未提交数据的行)。我通过简单地将脚本调用放在自定义菜单中解决了我的特定问题(当用户单击菜单时,所有数据都已提交)。我会继续探索你的解决方案,看看能不能找到答案。
  • 您在 CellCheckCount 1 中输入的数字是否比您要检查的行数多?因为公式检查 i
  • 是的,我意识到这一点,但是如果您的脚本检测到您有多少行,并且底行有尚未写入的数据,那么它不会检查该行。它会告诉脚本有 4 行,它会检查 4 行(缺少未写入数据的第 5 行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多