【问题标题】:Need help figuring out how to modify a Google Sheets script需要帮助弄清楚如何修改 Google 表格脚本
【发布时间】:2014-03-19 17:52:33
【问题描述】:

我了解一些编程基础知识并编写了一些代码,但已经有好几年了。我已经没有练习了,需要一些帮助,拜托。我知道我想做的事情的逻辑......我只是不确定如何编写或修改现有的脚本来实现它。

我正在使用 Google 表格电子表格,其中包含有关已提交维修的移动设备的数据。我现在用于跟踪多次提交维修的设备的过程是手动且耗时的,而且我知道必须有一种方法可以通过脚本使其更容易。

这是我希望改进的过程:

  1. 在电子表格的新行中输入序列号和相关数据。
  2. 使用 Ctrl-F 搜索以查看之前是否输入过序列号。
  3. 将具有匹配序列号的所有行复制到单独的电子表格中。
  4. 在第一个电子表格中突出显示复制的行,以表明它们已被复制到重复列表中。

当我一次只有一两个添加到电子表格中时,执行此手动检查没什么大不了的。但有时我会得到几十个甚至几百个条目……然后就变得非常不切实际了。

我在脚本库中进行了搜索,发现了这个: 在选定范围内查找重复项 给定一个选定的范围,此脚本将识别所有非空白重复单元格,并列出它们。通过 konigsberg@google.com

那个脚本是我的出发点。这有点帮助...我可以选择带有序列号的列,然后运行此脚本,它会输出一个对话框,其中包含多次出现的所有序列号的列表。

看起来只是把一个数组的输出转储出来,每一个都用逗号隔开,所以看起来不是很漂亮,不过我可以把列表复制到记事本中,手动把逗号取出来做成一个列表,然后使用上面概述的手动过程从该列表中工作,以确保已复制所有重复项。橙色突出显示让我知道我已经复制了一行,因此我不会多次添加相同的条目。仍然不太理想,但至少它缩小了我必须工作的范围。

短期而言,如果我能弄清楚如何格式化该对话框中的输出,使其更“漂亮”一点,或者用逗号和空格分隔序列号,而不是仅仅使用逗号,或者列出每个序列号换行,那会让我更开心。

理想情况下,如果我可以将整个比较和复制重复自动化到一个新的电子表格流程中,这样我就可以在我的主电子表格上运行脚本并最终得到一个列表,其中包含有关提交维修的设备的所有数据行不止一次,那就更好了。

或者,如果我可以在输入数据时找到一种方法,以便它自动检查序列号,让我知道它是否重复,并确保与该序列号相关的所有行已复制到另一个电子表格中,那也很棒。

如果有人对完成上述任何一项的简单(-ish)方法有任何建议,我将非常感激。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    你应该知道 StackOverFlow 绝对不是一个要求现成代码的地方,而且你已经在你的帖子上投了一个 cloe 投票(!)但是因为我发现这个用例很有趣,并且有一次可能对其他人有用我决定为它推荐一个代码。

    这是它的工作原理:您必须定义哪一列是序列号,在该列的空白单元格中输入您想要获取的序列号,然后从那里运行此函数。

    它将创建第二张名为“结果:序列号”的表格,具有相同的标题和所有重复项,除了您刚刚输入的那个。

    test sheet shared view only, make a copy to try it

    代码:

    function copyNonUniqueToSheet() {
      var sh = SpreadsheetApp.getActiveSpreadsheet();
      var ss = sh.getSheetByName('Sheet1');
      var data = ss.getDataRange().getValues();
      var headers = data.shift();
      var column = 1;
      var selectedRow = ss.getActiveCell().getRowIndex()-2;// does not work in new version of spreadsheets for now
      Logger.log(selectedRow);
     // selectedRow = Browser.inputBox('enter row number where you entered the serial number')
      var item = data[selectedRow][column-2];
      var newSheetData = []
      newSheetData.push(headers);
      for(var n in data){
        if(n ==selectedRow){continue};// remove this line if you want to include the original occurence
        if(data[n][column-1] == item){
          newSheetData.push(data[n]);
          ss.getRange(Number(n)+2, column).setBackground('yellow');
        }
      }
      sh.insertSheet('results ('+(sh.getNumSheets())+') :'+item).getRange(1,1,newSheetData.length,newSheetData[0].length).setValues(newSheetData);    
    }
    

    编辑:我只是忘记了新版本的电子表格中目前存在一个错误:getActiveCell 总是返回索引 1...所以选择不起作用。同时,使用 Browser.input 手动输入行号。

    【讨论】:

    • 这是一个在旧电子表格版本中实现的示例:docs.google.com/spreadsheet/…
    • 谢谢。抱歉,如果这是一个不恰当的帖子 - 这是我第一次来这里。我在谷歌上搜索帮助文件和教程等等,它把我指向了 StackOverflow。我最需要的是朝着正确的方向推进,或者确认
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多