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

Javascript 查找下一个唯一值并将公式添加到下两列,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,如何更改录制的宏以使其 在A列中查找下一个唯一值 去那排 在该行的C列中,粘贴公式=转置(过滤器($AZ:$BS,$AZ:$BS,$AZ:$BS?)在该行的D列中粘贴=转置(过滤器($F?:$Y?,$F?:$Y?)和E列=转置(过滤器($BW?:$CP,$BW:$CP) 我试图在Google Sheets上编写一个宏,在a列中找到下一个唯一的名称,然后将公式1应用于C列,将公式2应用于D列,将公式3应用于下一个唯一值所在行的E列 我记录了我手动操作的宏,但我真的不想这样做,因为我有大约2000

如何更改录制的宏以使其

  • 在A列中查找下一个唯一值
  • 去那排
  • 在该行的C列中,粘贴公式
    =转置(过滤器($AZ:$BS,$AZ:$BS,$AZ:$BS?)
    在该行的D列中粘贴
    =转置(过滤器($F?:$Y?,$F?:$Y?)
    和E列
    =转置(过滤器($BW?:$CP,$BW:$CP)

  • 我试图在Google Sheets上编写一个宏,在a列中找到下一个唯一的名称,然后将公式1应用于C列,将公式2应用于D列,将公式3应用于下一个唯一值所在行的E列

    我记录了我手动操作的宏,但我真的不想这样做,因为我有大约2000个唯一的名称要做

    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);
    };
    
    函数三公式(){
    var电子表格=SpreadsheetApp.getActive();
    电子表格.getRange('C2').activate();
    电子表格.getCurrentCell().setFormula('=转置(过滤器($AZ2:$BS2,$AZ2:$BS2')));
    电子表格.getRange('D2').activate();
    setFormula('=转置(过滤器($F2:$Y2,$F2:$Y2'));
    spreadsheet.getRange('E2').activate();
    setFormula('=转置(过滤器($BW2:$CP2,$BW2:$CP2'));
    spreadsheet.getRange('C12').activate();
    spreadsheet.getRange('C2:E2').copyTo(spreadsheet.getActiveRange(),SpreadsheetApp.copypesttype.PASTE_正常,false);
    电子表格.getRange('C22').activate();
    spreadsheet.getRange('C2:E2').copyTo(spreadsheet.getActiveRange(),SpreadsheetApp.copypesttype.PASTE_正常,false);
    };
    

    转置公式必须存在,因为数据库从D列到CP列吐出的报告非常不可靠。这里是数据的图像。我已经强调了下一个唯一值的位置。

    我相信您的目标如下

    • 您想检查列“A”的值
    • 当在列“A”中找到第一个唯一值时,需要将3个公式放入列“C”到“E”中。
      • 在示例图像中,您希望将公式放入单元格“C2:E2”、“C12:E12”和“C22:E22”
    • 在您的问题中,公式1、公式2和公式3分别是
      =转置(过滤器($AZ2:$BS2,$AZ2:$BS2”“)
      =转置(过滤器($F2:$Y2,$F2:$Y2”“)
      =转置(过滤器($BW2:$CP2,$BW2:$CP2”“)
    在这种情况下,为了实现您的目标,我使用以下流程

  • 从列“A”中检索所有值
  • 创建放置3个公式的范围列表
  • 使用创建的范围列表放置3个公式
  • 示例脚本: 请将以下脚本复制并粘贴到电子表格容器绑定脚本的脚本编辑器中。并设置
    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<>""))');
    }
    
    函数myFunction(){
    const sheetName=“Sheet1”//请设置图纸名称。
    //1.从列“A”中检索所有值。
    //2.创建放置3个公式的范围列表。
    const sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
    常数范围=表
    .getRange(“A2:A”+sheet.getLastRow())
    .getValues()
    .减少((o[a],i)=>{
    如果(a!=o.temp){
    o、 温度=a;
    常量行=i+2
    o、 f1.push(`C${row}`);
    o、 f2.push(`D${row}`);
    o、 f3.push(`E${row}`);
    }
    返回o;
    },{f1:[],f2:[],f3:[],温度:'});
    //3.使用创建的范围列表放置3个公式。
    sheet.getRangeList(ranges.f1).setFormulaR1C1('=转置(过滤器(R[0]C52:R[0]C71,R[0]C52:R[0]C71“”));
    sheet.getRangeList(ranges.f2).setFormulaR1C1('=转置(过滤器(R[0]C6:R[0]C25,R[0]C6:R[0]C25'));
    sheet.getRangeList(ranges.f3).setFormulaR1C1('=转置(过滤器(R[0]C75:R[0]C94,R[0]C75:R[0]C94'));
    }
    
    参考资料:
    补充: 我想我唯一的问题是,我不确定转置公式是如何更改的,我想知道如果我引用另一个工作表示例中的数据:转置(过滤器('Raw data Austin'!$BW2:$CP2,'Raw data Austin'!BW2:$CP2')),我将如何命名它

    关于,在这种情况下,请修改如下

    发件人:
    sheet.getRangeList(ranges.f1).setFormulaR1C1('=转置(过滤器(R[0]C52:R[0]C71,R[0]C52:R[0]C71'));
    sheet.getRangeList(ranges.f2).setFormulaR1C1('=转置(过滤器(R[0]C6:R[0]C25,R[0]C6:R[0]C25'));
    sheet.getRangeList(ranges.f3).setFormulaR1C1('=转置(过滤器(R[0]C75:R[0]C94,R[0]C75:R[0]C94'));
    
    致:
    sheet.getRangeList(ranges.f1).setFormulaR1C1(`=transpose(过滤器('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'))`);
    
    • 在此修改中,请注意使用模板文字

      • 我相信你的目标如下

        • 您想检查列“A”的值
        • 当在列“A”中找到第一个唯一值时,需要将3个公式放入列“C”到“E”中。
          • 在示例图像中,您希望将公式放入单元格“C2:E2”、“C12:E12”和“C22:E22”
        • 在您的问题中,公式1、公式2和公式3分别是
          =转置(过滤器($AZ2:$BS2,$AZ2:$BS2”“)
          =转置(过滤器($F2:$Y2,$F2:$Y2”“)
          =转置(过滤器($BW2:$CP2,$BW2:$CP2”“)
        在这种情况下,为了实现您的目标,我使用以下流程

      • 从列“A”中检索所有值
      • 创建放置3个公式的范围列表
      • 使用创建的范围列表放置3个公式
      • 示例脚本: 请将以下脚本复制并粘贴到绑定容器的脚本编辑器中
        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<>""))`);