【问题标题】:Modifying a flexible Google Sheets onEdit script to accommodate a wider range of inputs修改灵活的 Google 表格 onEdit 脚本以适应更广泛的输入
【发布时间】:2020-05-11 04:52:04
【问题描述】:

下面是一个脚本,它允许我将五个不同的 onEdit 函数组合成一个函数。

function onEdit(e){
  if (e.range.getA1Notation() != "H12" || e.value != "submitResponse") return;
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sh.getActiveSheet();
  var m = sh.getSheetByName("Master");
  ss.getRange(2,1,ss.getLastRow(),3).copyTo(m.getRange(m.getLastRow()+1,1,ss.getLastRow(),3)); 
  ss.getRange('H12').clearContent();
  e.range.clearContents();
}

我现在希望使这个脚本更加灵活。请参阅我的电子表格的 Sheet1:https://docs.google.com/spreadsheets/d/1EoOIQxWyKWOvtlCrmJNI76FAxGhzgXrE4s0F05tw2MY/edit#gid=0

如果我可以使用 H:H 的整个列来提交每个相应的行,而不是将自己限制在 H12 中,那就太好了。因此,当我将 H2 更改为 submitResponse 时,它​​会将 A2:G2 复制/粘贴到 Master 的最后一行。当我将 H3 更改为 submitResponse 时,它​​会将 A3:G3 复制/粘贴到 Master 的最后一行。以此类推。

我试过了,但没有成功。我想我错过了什么。

​function onEdit(e) {
  var ss = e.source;
  var s = ss.getActiveSheet();
  var r = e.range;
  var actionCol = 8;
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();
  var colNumber = s.getLastColumn()-1;
  if (e.value == "submitResponse" && colIndex == actionCol) ;
    var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
    var targetRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Master").getRange(getLastRow()+1, 1, 1, colNumber);
    sourceRange.copyTo(targetRange,SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    }

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    function onEdit(e){
      var sh=e.range.getSheet();
      if (sh.getName()=='Sheet1' && e.range.columnStart==8 && e.range.rowStart>1 && e.value=="submitResponse") {
        var msh=e.source.getSheetByName("Master");
        msh.appendRow(sh.getRange(e.range.rowStart,1,1,7).getDisplayValues()[0]);
      }
    }
    
    function onEdit(e){
      var sh=e.range.getSheet();
      if (sh.getName()=='Sheet1' && e.range.columnStart==8 && e.range.rowStart>1 && e.value=="Yes") {
        e.range.setValue('');
        var msh=e.source.getSheetByName("Master");
        msh.appendRow(sh.getRange(e.range.rowStart,1,1,7).getDisplayValues()[0]);
      }
    }
    

    【讨论】:

    • 哇 - 这似乎工作得很好!用更少的代码完成工作——令人印象深刻。我将如何修改此代码,以便清除用于触发代码的单元格(即清除“submitResponse”)?以前我用过:e.range.clearContents(); ...但这在这里不起作用。我正在尝试自己做,但你的方法非常独特,我很难过!
    • 实际上我的问题的一部分是这样的:提交后,我不仅要清除触发脚本的单元格(即 submitResponse 单元格),还要清除我指定的另一个单元格范围。我之前的脚本是这样工作的:function onEdit(e){ .... ss.getRange(4,1,1,24).copyTo(m.getRange(m.getLastRow()+1,1,1,14), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); ss.getRange('Y4').clearContent(); ss.getRange('A3:X3').clearContent(); e.range.clearContents();
    • 我将在使用不同范围的不同电子表格中使用此脚本,但我的想法是我会清除我选择“submitResponse”的单元格以及清除上方的行我在其中选择 submitResponse 的行。对于此测试电子表格,假设我要清除同一工作表的单元格 H3(将包含 submitResponse)和 A2:G2。
    • 你为什么不再问一个问题,把所有的事实都告诉我,这样会更容易回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多