0
function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn()
  var sheet = range.getSheet();
  Logger.log("The row is " + row + " and column is " + col + " the sheet is " + sheet);

  var sheet, sheetName, colToCapitalize;

  var sheetName, colToCapitalize;
  colToCapitalize = 2;
  sheetName = "FormResponses1";
  if (sheet.getName() !== sheetName || e.range.rowStart < 2 || e.range.columnStart !== colToCapitalize || typeof e.value == "object") return;
  e.range.setValue(e.value.toUpperCase());

  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");

  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();

  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();

  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

我想要的结果是,当从谷歌表单将新的数据行添加到工作表“FormResponses1”时,上面的脚本就会运行。我已经创建了谷歌表单,当用户提交表单时,新数据会添加到工作表“FormResponses1”中。

这是屏幕的 YouTube 视频,显示了我遇到的问题

如果我手动将新值添加到单元格,例如,如果我在工作表“FormResponses1”的单元格“B2”中写入“dll 463”,则上面的代码运行良好并且可以满足我的需要。

我已经为上面显示的 onEdit 函数设置了一个触发器“来自电子表格 - 表单提交”,使用 <> 脚本编辑器视图的工具栏中的 Edit - Current project's triggers。

触发器似乎确实触发了,如果我在从表单提交新响应后查看日志,我可以看到日志显示通过上面代码中的 Logger.log 行编辑的行和列。

我在上面的代码中添加了更多 Logger.log 行,以查看脚本在由“来自电子表格 - 提交表单”触发器触发时运行多远,但在行和列编辑日志之后没有显示其他日志。

这对我来说更奇怪的是,我昨天可以让触发器工作并运行代码。尽管如此,它只是在当前脚本末尾的 setFormula 行中编写,从那时起,我添加了大写列值,并将公式替换到脚本中。

我尝试过: - 删除并添加新触发器。- 创建一个新版本 - 删除表单响应 - 将函数从 onEdit() 更改为 onFormSubmit() - 取消电子表格的链接并添加一个新的电子表格(具有相同的工作表名称和数据),并将脚本复制到新的电子表格脚本编辑器和删除旧的电子表格。

4

1 回答 1

0

您遇到的问题(除了您编写的代码也有点混乱)是,当事件由“编辑时”或“表单提交”触发时,事件对象对它们来说是不同的,因此它们会没有相同的属性,您可以应用与代码中相同的逻辑。

这是编辑对象的样子,也是表单提交对象的样子。

知道。我通过以下方式修改了您的代码:

在您的主要功能中,我检查触发的原因是什么,如果它是编辑或提交事件,然后根据事件以及它们的条件是否为真,我调用onEditChangeoronSubmitChange函数。

function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn();
  var sheet = range.getSheet();
  var colToCapitalize = 2;
  var sheetName = "FormResponses1";
  // Let's see if it is a form or edit object, checking the namedValues properties
  if(!e.namedValues){
    // Edit event
    // Check the right conditions for an edit event
    if (sheet.getName() !== sheetName || row < 2 || col !== colToCapitalize || typeof e.value == "object") return;
    else onEditChange(e, sheet, row);
  } else {
    // Submit Event
     // Check the right conditions for a submit event
    if (sheet.getName() !== sheetName || row < 2 | typeof e.values != "object") return;
    else onSubmitChange(e, sheet, row);
  }
}

onEditChangeandonSubmitChange函数中,我将右侧单元格中的值设置为大写,然后调用该setFormulas函数。

// Call when there is an edit event 
function onEditChange(evt, sheet, row){
  // Uppercase the value where the triggered occured
  evt.range.setValue(evt.value.toUpperCase());
  setFormulas(sheet, row);
}

// Call when there is an submit event 
function onSubmitChange(evt, sheet, row){
  // Uppercase the value just in the value of the second col
  sheet.getRange(row, 2).setValue(evt.values[1].toUpperCase());
  setFormulas(sheet, row);
}

如名称所示,在 setFormulas函数中,我只是设置了您之前在 main 函数中设置的公式BatteryInspection

// Function for setting the formulas
// Call whether an edit or submit event happens
function setFormulas(sheet, row){
  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");
  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();
  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();
  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

整个代码现在看起来像这样:

function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn();
  var sheet = range.getSheet();
  var colToCapitalize = 2;
  var sheetName = "FormResponses1";
  // Let's see if it is a form or edit object, checking the namedValues properties
  if(!e.namedValues){
    // Edit event
    // Check the right conditions for an edit event
    if (sheet.getName() !== sheetName || row < 2 || col !== colToCapitalize || typeof e.value == "object") return;
    else onEditChange(e, sheet, row);
  } else {
    // Submit Event
     // Check the right conditions for a submit event
    if (sheet.getName() !== sheetName || row < 2 | typeof e.values != "object") return;
    else onSubmitChange(e, sheet, row);
  }
}

// Call when there is an edit event 
function onEditChange(evt, sheet, row){
  // Uppercase the value where the triggered occured
  evt.range.setValue(evt.value.toUpperCase());
  setFormulas(sheet, row);
}

// Call when there is an submit event 
function onSubmitChange(evt, sheet, row){
  // Uppercase the value just in the value of the second col
  sheet.getRange(row, 2).setValue(evt.values[1].toUpperCase());
  setFormulas(sheet, row);
}

// Function for setting the formulas
// Call whether an edit or submit event happens
function setFormulas(sheet, row){
  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");
  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();
  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();
  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

文档

有关更多信息,您还可以查看:

于 2020-01-13T12:32:56.467 回答