TypeError:找不到对象中的函数清除(谷歌脚本)

时间:2018-04-01 13:51:12

标签: javascript google-apps-script google-sheets

我正在尝试创建一个脚本来搜索整个工作簿" A"和工作簿" B"对于重复值,然后从工作簿中的位置删除包含副本的行" A"。

然而,当运行脚本时,我收到错误" TypeError:无法在对象中找到清除功能"回到我身边,我真的无法弄明白为什么。

我会尝试更详细地解释我想要实现的目标。

电子表格1包含等待提供给客户的所有未结订单的详细信息,标签名称可以每日更改,但大多数标签的格式相同,除了2个永远不会更改名称的标签。

电子表格2包含已提供和开具发票的订单的deatails。

因此,一旦我输入了机票号码。在电子表格2中,我必须在电子表格2中搜索票号。并删除该行,因为它不再是一个未结订单。我想要一个为我执行此任务的脚本。

我正在处理的脚本如下。

function deleteRowInSpreadsheet1() { 
      var s1 =SpreadsheetApp.openById("1pxWr3jOYZbcwlFR7igpSWa9BKCa2tTeliE8FwFCRTcQ").getSheets();
      for (var i=0; i<s1.length; i++) {
        var values1 = s1[i].getDataRange().getValues();
        var s2 = SpreadsheetApp.openById("18jLxZlge_UFkdTjlO6opuDk1VKeezhEPLe9B7n1OfQs").getSheets(); 
        for (var i=0; i<s1.length; i++) {
          var values2 = s2[i].getDataRange().getValues();
          var resultArray = [];
          for(var n in values2){
            var keep = true
            for(var p in values1){
              if( values1[n][0] == values1[p][0] && values2[n][1] == values1[p][1]){
                keep=false;
                break;
              }
            }
            if(keep){ 
              resultArray.push(values2[n]);
            }
          }
          s1.clear()
          s1.getRange(1,1,resultArray.length,resultArray[0].length).setValues(resultArray); 
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

关于特定错误

  

然而,在运行脚本时,我收到错误“TypeError:找不到对象中的函数清除”给我,我真的无法弄清楚原因。

代码行

var s1 =SpreadsheetApp.openById("1pxWr3jOYZbcwlFR7igpSWa9BKCa2tTeliE8FwFCRTcQ").getSheets();

将一组工作表对象分配给s1,但clear不是数组方法。

<小时/> 值得注意的是,问题上的代码还有其他编程错误,如:

  1. 嵌套for循环使用相同的变量i作为两者的迭代器。
  2. 在for循环中使用var s2 = SpreadsheetApp.openById("18jLxZlge_UFkdTjlO6opuDk1VKeezhEPLe9B7n1OfQs").getSheets();会使脚本效率低下
  3. 关于您的目标

    我认为您尝试调整answer by Serge insasGoogle Script: Delete row if a value in it exists in another sheet

    的代码

    function deleteRowInSheet1() {
      var s1 = SpreadsheetApp.openById("1RxtFWZJRWxgW-zUM6S-dvZ0yFe-G2DGJFWI3gAt-1T0").getSheetByName('Sheet1');
      var s2 = SpreadsheetApp.openById("1RxtFWZJRWxgW-zUM6S-dvZ0yFe-G2DGJFWI3gAt-1T0").getSheetByName('Sheet2');
      var values1 = s1.getDataRange().getValues();
      var values2 = s2.getDataRange().getValues();
      var resultArray = [];
      for (var n in values1) {
        var keep = true
        for (var p in values2) {
          if (values1[n][0] == values2[p][0] && values1[n][1] == values2[p][1]) {
            keep = false;
            break;
          }
        }
        if (keep) {
          resultArray.push(values1[n])
        };
      }
      s1.clear()
      s1.getRange(1, 1, resultArray.length, resultArray[0].length).setValues(resultArray);
    }

    设计错误是删除getSheetByName,假设这将使该函数适用于两个电子表格中的每个工作表。相反,您必须为每个电子表格包含一个循环,以遍历每个电子表格的所有表格。像下面这样的东西可以工作(我没有测试过它)

    function deleteRowInSpreadsheet1() {
      var ss1 = SpreadsheetApp.openById(/*add here your spreadsheet 1 id*/);
      var ss2 = SpreadsheetApp.openById(/*add here your spreadsheet 2 id*/);
      //
      for (var l in ss1) {
        for(var m in ss2 {
          var values1 = ss1[l].getDataRange().getValues();
          var values2 = ss2[m].getDataRange().getValues();
          var resultArray = [];
          for (var n in values1) {
            var keep = true;
            for (var p in values2) {
              if (values1[n][0] == values2[p][0] && values1[n][1] == values2[p][1]) {
                keep = false;
                break;
              }
            }
            if (keep) {
              resultArray.push(values1[n]);
            };
          }
          s1.clear();
          s1.getRange(1, 1, resultArray.length, resultArray[0].length).setValues(resultArray);
        } // closes l loop
      }  // closes m loop
    }