使用Google Query功能进行FTR计算 Apps脚本的参考资料

如何解决使用Google Query功能进行FTR计算 Apps脚本的参考资料

我正在尝试使用pivot tables创建交叉表Google Query function,以根据First Time Resolution (FTR) ratenumber of Issues received while booking Opportunities计算员工Total Opportunities booked

+---------+-------+---------+-----------+--------+-------+
| OppName | OppID | EmpName | MonthYear | Status | Issue |
+=========+=======+=========+===========+========+=======+
| abc     | 1000  | alex    | 2020-Jan  | active | yes   |
+---------+-------+---------+-----------+--------+-------+
| def     | 1001  | alex    | 2020-Jan  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| ghi     | 1002  | alex    | 2020-Feb  | active | no    |
+---------+-------+---------+-----------+--------+-------+
| jkl     | 1004  | mini    | 2020-Feb  | lost   | yes   |
+---------+-------+---------+-----------+--------+-------+
| mno     | 1005  | mini    | 2020-Feb  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| pqr     | 1006  | mini    | 2020-Mar  | active | no    |
+---------+-------+---------+-----------+--------+-------+
| stu     | 1007  | mini    | 2020-Mar  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| vwx     | 1008  | joe     | 2020-Jan  | won    | no    |
+---------+-------+---------+-----------+--------+-------+
| yza     | 1009  | joe     | 2020-Mar  | lost   | yes   |
+---------+-------+---------+-----------+--------+-------+

输出:

1. NO OF ISSUES:
+--------------+----------+----------+----------+
| NO OF ISSUES | 2020-Jan | 2020-Feb | 2020-Mar |
+--------------+----------+----------+----------+
| alex         |        2 |          |          |
+--------------+----------+----------+----------+
| mini         |          |        1 |        1 |
+--------------+----------+----------+----------+
| TOTAL        |        2 |        1 |        1 |
+--------------+----------+----------+----------+

FORMULA:

=TRANSPOSE(QUERY($A$2:$F,"select D,count(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D PIVOT C LABEL D 'NO OF ISSUES'",0))

...

2. TOTAL OPPORTUNITIES:
+---------------------+----------+----------+----------+
| TOTAL OPPORTUNITIES | 2020-Jan | 2020-Feb | 2020-Mar |
+---------------------+----------+----------+----------+
| alex                |        2 |        1 |          |
+---------------------+----------+----------+----------+
| joe                 |        1 |          |          |
+---------------------+----------+----------+----------+
| mini                |          |        1 |        2 |
+---------------------+----------+----------+----------+
| TOTAL               |        3 |        2 |        2 |
+---------------------+----------+----------+----------+

FORMULA:

=TRANSPOSE(QUERY($A$2:$F,count(B) WHERE D IS NOT NULL AND E!='lost' Group by D PIVOT C LABEL D 'TOTAL OPPORTUNITIES'",0))

...

3. FTR%:
+--------------+----------+----------+----------+
| FTR%         | 2020-Jan | 2020-Feb | 2020-Mar |
+--------------+----------+----------+----------+
| alex         |          |  100.00% |          |
+--------------+----------+----------+----------+
| joe          |  100.00% |          |          |
+--------------+----------+----------+----------+
| mini         |          |          |   50.00% |
+--------------+----------+----------+----------+
| AVERAGE FTR% |  100.00% |  100.00% |   50.00% |
+--------------+----------+----------+----------+

FORMULA:

NEED QUERY FORMULA TO CALCULATE FTR AND GENERATE THIS TABLE.

因此,一旦确定了第三张表的公式,我计划将所有3张表合并为一个查询公式:

={

{TRANSPOSE(QUERY($A$2:$F,"select COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D LABEL COUNT(B) 'FTR CALC' FORMAT COUNT(B) ' '",0))};
{TRANSPOSE(QUERY($A$2:$F,COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D PIVOT C LABEL D 'NO OF ISSUES'","select COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D LABEL COUNT(B) 'TOTAL'",0))};

{TRANSPOSE(QUERY($A$2:$F,"select COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D LABEL COUNT(B) ' ' FORMAT COUNT(B) ' '",COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D PIVOT C LABEL D 'TOTAL OPPORTUNITIES'","select COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D LABEL COUNT(B) 'TOTAL'",0))}

}

第三张表的每个单元格中的公式将为:

=IFERROR(IF(100%-(I2/I7)*100%=0,"",100%-(I2/I7)*100%),"")

或者简单地

=100%-(I2/I7)*100%   'above 2 crosstabs starting from column H

有人可以帮我生成第三张表吗?

解决方法

好吧,我觉得有些困惑,但是如果我理解正确的话,那么我的答案可能会满足您的要求。我不清楚您是要立即完成所有操作,还是要让中间的塔巴勒结果出现在工作表中-您引用了表1,表2和表3。对于第三个表,我有一个公式,但是它基于两个中间表。可能可以合并公式以消除中间表。

在样本表中的H9中考虑以下公式:

={
  {"FTR%",TRANSPOSE(SORT(UNIQUE(FILTER(D3:D,D3:D<>""))))}; 
  {                 SORT(UNIQUE(FILTER(C3:C,C3:C<>""))),ARRAYFORMULA(IFERROR(IF((N3:P5/I3:K5)=0,"",N3:P5/I3:K5),""))}
 }

第一个转置/排序将月份的顶部移到第二个月,第二个排序将所有代理的名称放入第一列,arrayformula用两个中间表中的机会数除以决议数,以填充在FTR值中。

请注意,我已经限制了中间表的范围,但这仅仅是因为在其下方包括了用于显示目的的元素。可以像输入数据表一样,使这些范围不受限制。

如果这不正确,请告诉我们您还需要什么。

在这里查看我的样本表。 https://docs.google.com/spreadsheets/d/16otcDfnmWMEL0YpgH3aH0vn4Gip6XEY7yPDLQ9Y-83A/edit?usp=sharing

enter image description here

,

一个Apps脚本解决方案

由于您已经对这些功能有了一个答案,我相信它将使您获得所需的结果,因此,我想为您的问题提供替代的解决方案。 (对我而言)使用Apps Script不仅容易得多,而且似乎更适合这些类型的工作。

尽管我知道有很多人喜欢用公式做一切,但它们却能为您提供力量。

我基于@ kirkg13答案中给出的示例电子表格示例,因为它比问题中的查找容易得多

首先,如果您不知道如何创建Apps脚本项目,请follow this tutorial

然后将数据填写在这样的一张纸上:

enter image description here

工作表名称为“ InputData”。尽管数据量取决于您,但列数必须相同。

创建另一个名为“报告”的工作表,并将其留空。

将此代码复制到脚本编辑器中:

function main() {
  var dataRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("InputData").getDataRange()
  
  var data = dataRange.getValues()
  var headers = data.shift()
  
  var dateRange = getDateRange(data)
  var agentData = buildAgentData(data)
  
  var reportData = buildReport(dateRange,agentData,headers)
  
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Report").getRange(1,1,reportData.length,reportData[0].length).setValues(reportData)
}

function getDateRange(data) {
  
  var dates = data.map( (record) => {return record[3]} )
  var minDate = new Date(Math.min.apply(null,dates))
  var maxDate = new Date(Math.max.apply(null,dates))
  
  var counter = minDate
  var dateRange = []
  while (counter <= maxDate) {
    dateRange.push(new Date(counter))
    counter.setDate(counter.getDate() + 1);
  }
  return dateRange
}

function buildAgentData(data) {
  
  agentData = {}
  
  data.forEach( (record) => {
    var name = record[2]
    var date = record[3]
    var resolved = record[6]
   
    if (!(name in agentData)) {
      agentData[name] = {[date]:{"cases":1,"resolved":resolved}}
    } else if (date in agentData[name]) {
      agentData[name][date]["cases"] += 1
      if (resolved == 1) {
        agentData[name][date]["resolved"] += 1
      }
    } else {
      agentData[name][date] = {"cases":1,"resolved":resolved}
    }
  })
  
  return agentData
}

function buildReport(dateRange,headers) {
  
  // BUILDING DATA ROWS
  
  var opportunities = [];
  var resolutions = [];
  var ftr = [];
    
  for(agent in agentData) {
    
    var rowOpp = [agent];
    var rowRes = [agent];
    var rowFtr = [agent];
    
    dateRange.forEach( (date) => {
    
      try {rowOpp.push(agentData[agent][date]["cases"])}
        catch(e){rowOpp.push("0")};
      try {rowRes.push(agentData[agent][date]["resolved"])}
        catch(e){rowRes.push("0")};
      try {rowFtr.push(agentData[agent][date]["resolved"] / agentData[agent][date]["cases"])}
        catch(e){rowFtr.push("0")};
    
    });
    
    opportunities.push(rowOpp);
    resolutions.push(rowRes);
    ftr.push(rowFtr);
  }
  
  
  // BUILDING HEADERS
  
  var headerOpp = ["Opportunities"]
  var headerRes = ["Resolutions"]
  var headerFtr = ["FTR"]
  
  dateRange.forEach( (date) => {
                    headerOpp.push("");
                    headerRes.push("");
                    headerFtr.push("");
                    });
  
  dateRange.unshift("");
  
  // BUILDING FINAL REPORT
  
  var report = [dateRange,headerOpp]
  opportunities.forEach((row) => {report.push(row)})
  report.push(headerRes)
  resolutions.forEach((row) => {report.push(row)})
  report.push(headerFtr)
  ftr.forEach((row) => {report.push(row)})
  
  return report
}

这将使用这些动态表填充“报告”标签。

这只是一个框架,供您用作学习工具或适应您的特定需求。

Apps脚本的参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res