繁体   English   中英

Google Apps Script成功触发On Form Submit,但是function不会执行

[英]Google Apps Script successfully triggers On Form Submit, but function will not execute

如果表单响应中的值符合特定条件,我正在尝试将链接表单响应表“主”中的一行复制到另一个表“子”,第 4 列 =“子集”

我将 onFormSubmit 设置为部署的触发器 - 头,源 - 电子表格,事件 - 表单提交。 当我提交表单时,onFormSubmit 的触发器将执行记录为已完成,但该行不会复制到“子”工作表。

getLast function 允许我将该行移动到从第二列开始的“子”工作表中的下一个可用 position,因为我在第一列中一直有复选框。

当使用 onEdit function 并在第 4 列中手动输入“子集”时,代码按原样工作。我似乎无法弄清楚为什么即使成功执行了触发器,onFormSubmit 也没有发生任何事情。 请帮忙!

function onFormSubmit(e) {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var s = e.source.getActiveSheet();
 var r = e.source.getActiveRange();

 if(s.getName() == "main" && r.getColumn() == 4 && r.getValue() == "Subset") {
  var row = r.getRow();
  var numColumns = s.getLastColumn();
  var targetSheet = ss.getSheetByName("sub");
  var column = targetSheet.getRange("B:B").getValues();
  var lastRow = getLast(column);
  var target = targetSheet.getRange(lastRow + 1, 2);
  s.getRange(row, 1, 1, numColumns).copyTo(target);
 }
}

function getLast(range){
 var rowNum = 0;
 var blank = false;
 for(var row = 0; row < range.length; row++){

  if(range[row][0] === "" && !blank){
   rowNum = row;
   blank = true;
  }else if(range[row][0] !== ""){
   blank = false;
  }
 }
 return rowNum;
}

谢谢 Tanaike,我只是在你发布时弄清楚了这一点。 On Form Submit 触发器传递的事件 object 没有为 .getActiveSheet() 和 .getActiveRange() 赋值,因为没有活动用户。

我的解决方案不如您的解决方案优雅,但它成功了。 我很欣赏您如何通过直接从事件 object 中获取工作表来完全绕过 SpreadsheetApp。

function onFormSubmit(e) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheetByName("main");
   var response = e.values;
  
   if(response[3] == "Subset") {
     var row = sheet.getLastRow();
     var numColumns = sheet.getLastColumn();
     var targetSheet = ss.getSheetByName("sub");
     var column = targetSheet.getRange("B:B").getValues();
     var lastRow = getLast(column);
     var target = targetSheet.getRange(lastRow + 1, 2);
     sheet.getRange(row, 1, 1, numColumns).copyTo(target);
   }
} 

在进一步检查并受到您的解决方案的启发后,我将您的方法与我在 if 语句中使用 e.values 相结合,以采用精益和实用的方法。 非常感谢,田内池!

function onFormSubmit(e) {
  var response = e.range;
  
  if(response.getValues()[0][3] == "Subset") {
    var targetSheet = e.source.getSheetByName("sub");
    var col = targetSheet.getRange("B:B").getValues();
    var lastRow = getLast(col);
    var target = targetSheet.getRange(lastRow + 1, 2);
    response.copyTo(target);
  }
}

我认为从您的问题来看,当您的脚本由 OnSubmit 触发器运行时, if(s.getName() == "main" && r.getColumn() == 4 && r.getValue() == "Subset") {}的 if 语句if(s.getName() == "main" && r.getColumn() == 4 && r.getValue() == "Subset") {}可能始终为false ,因为在这种情况下,范围不是“D”列。 这样,您的脚本就不起作用了。 我认为这可能是您遇到问题的原因。

当触发 OnSubmit 触发器时,为了运行 if 语句中的脚本,如何进行以下修改?

修改脚本:

function onFormSubmit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var srcRange = sheet.getRange(range.rowStart, 1, 1, sheet.getLastColumn());
  if (srcRange.getValues()[0][3] == "Subset") { // srcRange.getValues()[0][3] means the column "D".
    var targetSheet = e.source.getSheetByName("sub");
    var column = targetSheet.getRange("B:B").getValues();
    var lastRow = getLast(column);
    var target = targetSheet.getRange(lastRow + 1, 2);
    srcRange.copyTo(target);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM