如何解决使用Google Query功能进行FTR计算 Apps脚本的参考资料
我正在尝试使用pivot tables
创建交叉表Google Query function
,以根据First Time Resolution (FTR) rate
与number 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
,一个Apps脚本解决方案
由于您已经对这些功能有了一个答案,我相信它将使您获得所需的结果,因此,我想为您的问题提供替代的解决方案。 (对我而言)使用Apps Script不仅容易得多,而且似乎更适合这些类型的工作。
尽管我知道有很多人喜欢用公式做一切,但它们却能为您提供力量。
我基于@ kirkg13答案中给出的示例电子表格示例,因为它比问题中的查找容易得多
首先,如果您不知道如何创建Apps脚本项目,请follow this tutorial。
然后将数据填写在这样的一张纸上:
工作表名称为“ 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 举报,一经查实,本站将立刻删除。