【问题标题】:Copy row to another tab, getFormulas, clearContent, setFormulas将行复制到另一个选项卡,getFormulas、clearContent、setFormulas
【发布时间】:2019-11-26 20:45:10
【问题描述】:

当从第 8 列的下拉列表中选择“已完成”时,我正在尝试让 google 表格自动复制一行并将其粘贴到另一个选项卡的底部。然后我希望它从该行中获取公式,清除该行,然后替换公式。该代码可以复制并粘贴到另一个选项卡,但我无法获取公式,清除行然后替换公式。我什至无法让它清除行。代码正确执行除了最后四行之外的所有内容。

这不是我的代码。我从一个网站上得到它并修改它以适合我的工作表。我对javascript有非常基本的了解。我需要保留原始行并仅填充公式,以便可以重复使用。我使用的是 copyTo 而不是 moveTo,因为该行正在由另一个工作表在上游引用,并且 moveTo 会导致上游电子表格上的公式自动更新到数据的新位置,而不是继续引用原始行。感谢您的任何帮助。

function myStorage() {

 // moves a row from a sheet to another when a value is entered in a column

 var sheetNameToWatch = "In Progress";

 var columnNumberToWatch = 8;

 var valueToWatch = "Completed";

 var sheetNameToMoveTheRowTo = "Storage";



 var ss = SpreadsheetApp.getActiveSpreadsheet();

 var sheet = SpreadsheetApp.getActiveSheet();

 var range = sheet.getActiveCell();



 if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {

   var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);

   var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

   sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);

// this is where it stops working.  I'm not sure how to grab just the row of the active cell and do the following

   var clearRange = sheet.getRange(range.getRow());

   clearRange.getFormulas();

   clearRange.clearContent();

   clearRange.setFormulas();
 }

}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    function CallItSomethingElse(e) {
      var sh=e.range.getSheet();
      if (sh.getName()=="In Progress" && e.range.columnStart==8 && e.value=="Completed") {
        var targetSheet = e.source.getSheetByName("Storage");
        var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
        sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).copyTo(targetRange);
        var clearRange=sh.getRange(e.range.rowStart,1,1,sh.getLastColumn());
        var fA=clearRange.getFormulas();//returns a 2d array of formulas
        clearRange.clearContent();
        clearRange.setFormulas(fA);//you have to add that array back into this line
      }
    }
    

    因为很多人会获取这段代码并尝试从编辑器运行它只是为了返回并告诉我他们得到了找不到方法 getSheet of undefined 的错误。首先让我建议您不能在没有事件对象的情况下运行此代码。单个 e 是将事件对象放入的参数。没有 e 程序无法运行。此外,除非有创建 e 的触发器,否则脚本无法运行。因此,如果您希望从脚本编辑器运行它,那么您必须提供事件对象。我不选择这样做,所以当我调试这些东西时,我会实时触发。

    【讨论】:

    • 谢谢!这是有效的。不过,它会粘贴到存储表两次,因此每行都粘贴了两行标记为“已完成”并已复制。
    • 编辑:我测试的前三次,它是双重复制到存储表,但我刚刚执行的三个测试没有这样做。它只复制了一次。不知道是什么导致了前三个,但它现在似乎正在工作。谢谢!
    • 刚刚又测试了一下,是双贴。奇怪的是它一直在这样做。
    • 我做了一些更改。请再试一次
    • 我测试了两次。第一次贴一次,第二次贴两次。触发器设置为在编辑时执行。可能是我的其他原因导致它或滞后吗?
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2022-10-06
    • 2022-10-15
    相关资源
    最近更新 更多