【问题标题】:Can I use Insert_Row as trigger for cell.setFormula?我可以使用 Insert_Row 作为 cell.setFormula 的触发器吗?
【发布时间】:2017-04-07 20:09:07
【问题描述】:

这里是 Google Apps 脚本新手,

我有一个 IFTTT 小程序,它通过电子邮件向此电子表格添加一行:Data Test

多亏了令人惊叹的 StackOverflow 社区,我现在能够手动添加一行,用正确的引用设置所需的公式,我想要脚本自动将这些相同的公式设置到插入的任何新行的相应单元格中。

例如,我的 IFTTT.com 自动化将使用文本填充单元格 A6 和 B6(即,在链接的电子表格中创建下一个空白行)——我需要将当前输入的所有公式应用于 B6(而不是 B2 )

var ss = SpreadsheetApp.getActiveSpreadsheet();
function onOpen() {
  var items = [
    {name: 'Add Row', functionName: 'addrow'},
  ];
    ss.addMenu('Add Row', items);
    }

function addrow() {
  var ui = SpreadsheetApp.getUi(); 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var result = ui.prompt(
      'Enter number of Row',
      ui.ButtonSet.OK_CANCEL);

    // Process the user's response.
  var button = result.getSelectedButton();
  var rownum = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
  sheet.insertRowAfter(rownum);
  var cell = sheet.getRange("C" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("details",$B' + rownum +')+7,SEARCH(",",$B' + rownum +')-SEARCH("details",$B' + rownum +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("D" + rownum);
  cell.setFormula('=IFERROR(TRIM(LEFT(SUBSTITUTE(MID(B' + rownum +',FIND("$",B' + rownum +'),LEN(B' + rownum +'))," ",REPT(" ",100)),100)),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("E" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("exceed",$B' + rownum +')+7,SEARCH("%",$B' + rownum +')-SEARCH("exceed",$B' + rownum +')-6),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("F" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("due",$B' + rownum +')+3,SEARCH(";",$B' + rownum +')-SEARCH("due",$B' + rownum +')-3),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("G" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("held on",$B' + rownum +')+7,SEARCH(". Lottery",$B' + rownum +')-SEARCH("held on",$B' + rownum +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("H" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("posted by",$B' + rownum +')+9,SEARCH(". ",$B' + rownum +')-SEARCH("",$B' + rownum +')-167),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  } else if (button == ui.Button.CANCEL) {
    // User clicked "Cancel".

  } else if (button == ui.Button.CLOSE) {
    // User clicked X in the title bar.

  }
}

需要明确的是,我想做的(而不是添加菜单来手动插入一行)是有一个脚本来检测插入新行时是否会触发以下操作:

  var cell = sheet.getRange("C" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("details",$B' + rownum +')+7,SEARCH(",",$B' + rownum +')-SEARCH("details",$B' + rownum +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("D" + rownum);
  cell.setFormula('=IFERROR(TRIM(LEFT(SUBSTITUTE(MID(B' + rownum +',FIND("$",B' + rownum +'),LEN(B' + rownum +'))," ",REPT(" ",100)),100)),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("E" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("exceed",$B' + rownum +')+7,SEARCH("%",$B' + rownum +')-SEARCH("exceed",$B' + rownum +')-6),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("F" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("due",$B' + rownum +')+3,SEARCH(";",$B' + rownum +')-SEARCH("due",$B' + rownum +')-3),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("G" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("held on",$B' + rownum +')+7,SEARCH(". Lottery",$B' + rownum +')-SEARCH("held on",$B' + rownum +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
  var cell = sheet.getRange("H" + rownum);
  cell.setFormula('=IFERROR(MID($B' + rownum +',SEARCH("posted by",$B' + rownum +')+9,SEARCH(". ",$B' + rownum +')-SEARCH("",$B' + rownum +')-167),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');

任何帮助将不胜感激!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    只要编辑电子表格,此功能即可使用。您可能必须将其测试为“任何时候”,它已被编辑并添加了功能。似乎不是最好的方法,但它有点像你想要的。

    function onEdit(e){
        var ui = SpreadsheetApp.getUi(); 
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getSheets()[0];
        var range = e.range;
        var range2 = range.getRow();
        var destrange = range2 + 1;
      
        // inserts blank row after last edit.
        sheet.insertRowAfter(range2);
      
        // adds the formulas
        var cell = sheet.getRange("C" + destrange);
        cell.setFormula('=IFERROR(MID($B' + destrange +',SEARCH("details",$B' + destrange +')+7,SEARCH(",",$B' + destrange +')-SEARCH("details",$B' + destrange +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("D" + destrange);
        cell.setFormula('=IFERROR(TRIM(LEFT(SUBSTITUTE(MID(B' + destrange +',FIND("$",B' + destrange +'),LEN(B' + destrange +'))," ",REPT(" ",100)),100)),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("E" + destrange);
        cell.setFormula('=IFERROR(MID($B' + destrange +',SEARCH("exceed",$B' + destrange +')+7,SEARCH("%",$B' + destrange +')-SEARCH("exceed",$B' + destrange +')-6),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("F" + destrange);
        cell.setFormula('=IFERROR(MID($B' + destrange +',SEARCH("due",$B' + destrange +')+3,SEARCH(";",$B' + destrange +')-SEARCH("due",$B' + destrange +')-3),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("G" + destrange);
        cell.setFormula('=IFERROR(MID($B' + destrange +',SEARCH("held on",$B' + destrange +')+7,SEARCH(". Lottery",$B' + destrange +')-SEARCH("held on",$B' + destrange +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("H" + destrange);
        cell.setFormula('=IFERROR(MID($B' + destrange +',SEARCH("posted by",$B' + destrange +')+9,SEARCH(". ",$B' + destrange +')-SEARCH("",$B' + destrange +')-167),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
    
    }

    【讨论】:

    • 出现错误:TypeError:无法从未定义中读取属性“范围”。 (第 5 行,文件“代码”)
    • 好的,取消它,它可以在电子表格本身中使用。如果我只希望它检查第 2 列中的变化怎么办?
    • 查看我提供的其他答案。
    【解决方案2】:

    按照此相关 SO 帖子 - Google Script: function that insert new row copying functions/formulas from last row 中的建议,尝试使用上一行中的 getFormula() 和新行中的 setFormula()

    getFomula() 代码:

     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var sheet = ss.getSheets()[0];
    
     // This assumes we have a function in B5 that sums up
     // B2:B4
     var range = sheet.getRange("B5");
    
     // Logs the calculated value and the formula
     Logger.log("Calculated value: %s Formula: %s",
                range.getValue(),
                range.getFormula());
    

    setFormula() 代码:

     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var sheet = ss.getSheets()[0];
    
     var cell = sheet.getRange("B5");
     cell.setFormula("=SUM(B3:B4)");
    

    希望这会有所帮助。

    【讨论】:

    • 好的,但我不需要插入新行,这已经自动为我完成了。相反,我需要一个脚本来检测已插入新行,然后用公式填充单元格或从上一个复制公式。行。
    • 尝试检查这个相关的 SO post,检测用户在谷歌电子表格中插入行或列并在脚本中做出反应有困难。
    • 如何使用 onEdit 触发器用公式填充最后一个非空白行?那会是什么样子?
    • 如果您检查上面帖子的链接,有人使用 onEdit() 和 onChange() 来跟踪此更改。
    【解决方案3】:

    执行此操作的另一种方法- 现在,如果最后一行 B 列不为空,它将填充公式。适用于每次编辑。

    function onEdit(){
        var ui = SpreadsheetApp.getUi(); 
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getSheets()[0];
        var lastRow = ss.getLastRow();
        var lastRow2 = lastRow+1;
        var s = ss.getSheetByName('sheet1');
        var lRow = s.getRange(lastRow, 2).getValue();
        var newRow = s.getRange(lastRow2, 2).getValue();
         if(lRow != ""){
    
        // adds the formulas
        var cell = sheet.getRange("C" + lastRow2);
        cell.setFormula('=IFERROR(MID($B' + lastRow2 +',SEARCH("details",$B' + lastRow2 +')+7,SEARCH(",",$B' + lastRow2 +')-SEARCH("details",$B' + lastRow2 +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("D" + lastRow2);
        cell.setFormula('=IFERROR(TRIM(LEFT(SUBSTITUTE(MID(B' + lastRow2 +',FIND("$",B' + lastRow2 +'),LEN(B' + lastRow2 +'))," ",REPT(" ",100)),100)),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("E" + lastRow2);
        cell.setFormula('=IFERROR(MID($B' + lastRow2 +',SEARCH("exceed",$B' + lastRow2 +')+7,SEARCH("%",$B' + lastRow2 +')-SEARCH("exceed",$B' + lastRow2 +')-6),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("F" + lastRow2);
        cell.setFormula('=IFERROR(MID($B' + lastRow2 +',SEARCH("due",$B' + lastRow2 +')+3,SEARCH(";",$B' + lastRow2 +')-SEARCH("due",$B' + lastRow2 +')-3),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("G" + lastRow2);
        cell.setFormula('=IFERROR(MID($B' + lastRow2 +',SEARCH("held on",$B' + lastRow2 +')+7,SEARCH(". Lottery",$B' + lastRow2 +')-SEARCH("held on",$B' + lastRow2 +')-7),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
        var cell = sheet.getRange("H" + lastRow2);
        cell.setFormula('=IFERROR(MID($B' + lastRow2 +',SEARCH("posted by",$B' + lastRow2 +')+9,SEARCH(". ",$B' + lastRow2 +')-SEARCH("",$B' + lastRow2 +')-167),HYPERLINK("https://housing.sfgov.org/listings","See Housing Portal"))');
         }
    }

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      相关资源
      最近更新 更多