查找下一个唯一值并将公式添加到下两列

时间:2020-10-05 23:05:42

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

如何以某种方式更改录制的宏

  1. 在A列中查找下一个唯一值。
  2. 转到该行
  3. 在该行的C列中粘贴公式=transpose(filter($AZ#:$BS#,$AZ#:$BS#<>""))在该行的D列中粘贴=transpose(filter($F#:$Y#,$F#:$Y#<>""))和E列=transpose(filter($BW#:$CP#,$BW#:$CP#<>""))

我正在尝试在Google表格上编写一个宏,该宏将在A列中找到下一个唯一的名称,然后将公式1应用于C列,将公式2应用于D列,将公式3应用于该行的E列,其中下一个唯一值是。

我记录了我手动执行的宏,但是我真的不愿意这样做,因为我有大约2,000个唯一的名称。

function threeformulas() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('C2').activate();
  spreadsheet.getCurrentCell().setFormula('=transpose(filter($AZ2:$BS2,$AZ2:$BS2<>""))');
  spreadsheet.getRange('D2').activate();
  spreadsheet.getCurrentCell().setFormula('=transpose(filter($F2:$Y2,$F2:$Y2<>""))');
  spreadsheet.getRange('E2').activate();
  spreadsheet.getCurrentCell().setFormula('=transpose(filter($BW2:$CP2,$BW2:$CP2<>""))');
  spreadsheet.getRange('C12').activate();
  spreadsheet.getRange('C2:E2').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('C22').activate();
  spreadsheet.getRange('C2:E2').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

转置公式必须存在,因为数据库会从D列到CP散发真正奇怪的报告。这里是数据外观的图像。我突出了下一个唯一值的位置。enter image description here

2 个答案:

答案 0 :(得分:4)

我相信您的目标如下。

  • 您要检查“ A”列的值。
  • 在“ A”列中找到第一个唯一值时,您想将3个公式放入“ C”至“ E”列中。
    • 在示例图像中,您想要将公式放入单元格“ C2:E2”,“ C12:E12”和“ C22:E22”。
  • 在您的问题中,公式1,公式2和公式3分别为=transpose(filter($AZ2:$BS2,$AZ2:$BS2<>""))=transpose(filter($F2:$Y2,$F2:$Y2<>""))=transpose(filter($BW2:$CP2,$BW2:$CP2<>""))

在这种情况下,为了实现您的目标,我使用以下流程。

  1. 从“ A”列中检索所有值。
  2. 创建用于放置3个公式的范围列表。
  3. 使用创建的范围列表放置3个公式。

示例脚本:

请将以下脚本复制并粘贴到Spreadsheet的容器​​绑定脚本的脚本编辑器中。并设置sheetName

function myFunction() {
  const sheetName = "Sheet1";  // Please set the sheet name.

  // 1. Retrieve all values from the column "A".
  // 2. Create the range list for putting 3 formulas.
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const ranges = sheet
    .getRange("A2:A" + sheet.getLastRow())
    .getValues()
    .reduce((o, [a], i) => {
      if (a != o.temp) {
        o.temp = a;
        const row = i + 2
        o.f1.push(`C${row}`);
        o.f2.push(`D${row}`);
        o.f3.push(`E${row}`);
      }
      return o;
    }, {f1: [], f2: [], f3: [], temp: ""});

  // 3. 3 formulas are put using the created range list.
  sheet.getRangeList(ranges.f1).setFormulaR1C1('=transpose(filter(R[0]C52:R[0]C71,R[0]C52:R[0]C71<>""))');
  sheet.getRangeList(ranges.f2).setFormulaR1C1('=transpose(filter(R[0]C6:R[0]C25,R[0]C6:R[0]C25<>""))');
  sheet.getRangeList(ranges.f3).setFormulaR1C1('=transpose(filter(R[0]C75:R[0]C94,R[0]C75:R[0]C94<>""))');
}

参考文献:

已添加:

我想我唯一的问题是我不确定转置公式如何更改,并且我想知道如果Im引用另一个工作表示例中的数据该怎么写:transpose(filter('Raw Data-Austin'! $ BW2:$ CP2,'Raw Data-Austin'!BW2:$ CP2 <>“”))

关于this your additional question,在这种情况下,请进行以下修改。

发件人:

sheet.getRangeList(ranges.f1).setFormulaR1C1('=transpose(filter(R[0]C52:R[0]C71,R[0]C52:R[0]C71<>""))');
sheet.getRangeList(ranges.f2).setFormulaR1C1('=transpose(filter(R[0]C6:R[0]C25,R[0]C6:R[0]C25<>""))');
sheet.getRangeList(ranges.f3).setFormulaR1C1('=transpose(filter(R[0]C75:R[0]C94,R[0]C75:R[0]C94<>""))');

收件人:

sheet.getRangeList(ranges.f1).setFormulaR1C1(`=transpose(filter('Raw Data-Austin'!R[0]C52:R[0]C71,'Raw Data-Austin'!R[0]C52:R[0]C71<>""))`);
sheet.getRangeList(ranges.f2).setFormulaR1C1(`=transpose(filter('Raw Data-Austin'!R[0]C6:R[0]C25,'Raw Data-Austin'!R[0]C6:R[0]C25<>""))`);
sheet.getRangeList(ranges.f3).setFormulaR1C1(`=transpose(filter('Raw Data-Austin'!R[0]C75:R[0]C94,'Raw Data-Austin'!R[0]C75:R[0]C94<>""))`);
  • 在此修改中,请小心使用模板文字。

答案 1 :(得分:1)

与Tanaike在their answer上所做的一样,我认为最好从头开始,而不是编辑已录制的宏,因为已录制的宏会激活每个要编辑的单元格,但这会使您的“宏”变慢甚至更多不必要的重要。

因此,您应该首先了解Google Apps脚本使用JavaScript。 Tanaike的答案使用了一些有趣的编程内容,例如:

  • 变量
  • 方法链接
  • 模板文字
  • Array.prototype.reduce

以及某些特定的电子表格服务功能,例如

  • 范围列表
  • R1C1公式表示法

如果尚未完成,请阅读https://developers.google.com/apps-script/guides/sheets

相关