【问题标题】:How to write to a cell when given a range with the onFormSubmit trigger? (Google apps script)使用 onFormSubmit 触发器给定范围时如何写入单元格? (谷歌应用脚​​本)
【发布时间】:2020-08-06 23:22:29
【问题描述】:

我是使用谷歌应用程序脚本编码的新手,我正在尝试为我的电子表格制作一个简单的大小写检查器。

在这种情况下,我想检查名称的第一个字母是否大写,如果不是,我想用更正的版本替换它(同名,只是第一个字母大写。)

此代码在尝试在编辑器中运行时返回错误(无法读取未定义的属性“范围”。)我认为这是因为它使用了 onFormSubmit 触发器,因此测试它的唯一方法是实际提交表单回复。

当发布新的表单响应并触发该函数时,它似乎在电子表格的末尾没有做任何事情。包含名字和姓氏的新单元格(或与此相关的任何新单元格)根本不会改变,无论是否首字母大写。

当使用以相同方式引用单元格的单独函数时(获取新提交的单元格范围并在 for 循环中将它们指定为 row[numberhere]),它可以很好地读取它们的字符串。

function caseCheck(r) {
  var range = r.range;
  var data1 = range.getValue();
  for (var r in data1) {
    var row1 = data1[r];
    var firstName = row1[2].getValue;
    var lastName = row1[3].getValue;
    var firstNameC = firstName[0].toUpperCase();
    var lastNameC = lastName[0].toUpperCase();

    if (firstName[0] != firstNameC) {
      var firstNameL = firstName.length();
      var firstNameSS = firstName.substring(1,firstNameL);
      var firstNameCorrected = firstNameC + firstNameSS;
      row1[2].setValue(firstNameCorrected);
    }

    if (lastName[0] != lastNameC) {
      var lastNameL = lastName.length();
      var lastNameSS = lastName.substring(1,lastNameL);
      var lastNameCorrected = lastNameC + lastNameSS;
      row1[3].setValue(lastNameCorrected);
    }
  }
}

【问题讨论】:

  • 您不能将 onFormSubmit() 函数作为独立函数运行。如您所见,此函数需要一个参数。如果您只是尝试在不提供参数的情况下运行它,它将不会运行,因为它确实知道 r 是什么。首先,您需要确保已将此函数注册为 onFormSubmit() 方法。在此处查看第一个答案:stackoverflow.com/questions/17992718/…
  • 我已经按照您参考的帖子中的详细信息设置了触发器。关于我可能做错的任何其他想法?

标签: google-apps-script


【解决方案1】:

您对所示代码有几个问题。

我认为您的意思是使用复数 range.getValues() 而不是 range.getValue() 因为 .getValue 只是返回范围左上角单元格内的对象。如果data1 是一个字符串,那么for (var r in data1) 只是循环一个字符串,而不是一个值数组。

假设你修复了data1,所以它是一个数组数组,那么row1只是一个JavaScript数组,大概是一个字符串数组,所以你使用的各个地方例如row1[2].getValue(无论如何都没有括号)和 row1[2].setValue(firstNameCorrected) 不应该有任何效果,因为它们是字符串,而不是 Range 对象。

您需要做的是根据需要对数据数组进行变异,然后使用变异数据调用range.setValues(data)。

function caseCheck(r) {
  var range = r.range;
  var data = range.getValues();
  for (var r in data) {
    var row = data[r];
    // do whatever mutation to row you want
  }
  range.setValues(data);
}

作为旁注,个人偏好/建议,这种命令式变异代码非常难以阅读和维护。考虑使用更多(和更小)的功能......

function caseCheck(r) {
  var range = r.range;
  var data = range.getValues();
  var newData = data.map(rowCapitalizeFunction);
  range.setValues(newData);
}

function rowCapitalizeFunction(row) {
  var firstName = row[2];
  // etc ... do what you need to do
  return [/* send back a new array with new values, much easier to understand! */];
}

【讨论】:

  • @Toklo490 - 是的,我看到了更多问题!请参阅我编辑的答案。
  • 知道了!谢谢 - 这非常有帮助。是的,我当然需要使用更多/更小的函数!
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多