查找哪些用户正在使用相同的 JobID
Find which users are working on the same JobID
我只从 Google 电子表格中的每个用户 Sheet 提取 JobID 列。我想查询哪些用户正在使用相同的 JobID。我还需要将用户名列为查询的列,因为该列不存在于每个用户 Sheet 中,尽管 Sheet 名称是用户名。有没有办法使用 Google 查询来做到这一点?
例如
JobID | Count | Users using it |
----------------------------------------------------
1001 | 3 | alex, hubert, mark |
1002 | 1 | mark |
1003 | 2 | sally, chaz, maha |
1004 | 1 | hubert |
1005 | 2 | maha, mark |
P.S:此外,Sheets 可以重命名为其他用户。所以需要一些动态的东西。
这里是 link 到 Sample file。
像下面这样的东西行得通吗?
它动态地将 sheet 名称从“用户”选项卡中提取到“查询”。我想您还想先从该用户选项卡中删除报告和用户名。
这个在Report的C2里面,目前需要往下拖。我看看能不能想出一个数组公式。
=TEXTJOIN(", ",1,
{IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,"") })
我只允许 6 个用户,但可以扩展到处理 10 到 20 个用户,使用 IF 或 IFERROR 测试来避免在任何时候“用户”选项卡中的用户较少时出现问题。
如果您对此有任何疑问,请告诉我。
更新#1
以下是扩展为允许 20 个用户的公式。只要将它们添加到 Users!A1:A20 中的任何位置,并且它们的 sheet 名称与其列出的名称相匹配,它们的值就会被包含在内。如果您发现任何问题,请告诉我。我仍然会尝试看看它是否可以变成一个数组公式。
=textjoin(", ",1,
{if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,"")})
根据您的意见,我得到了 return JobID 和用户的单一公式。但是为了包括用户数量,我不得不添加另一列和公式。见下文:
D1中的关键公式如下:
={"Job ID","Users (hidden)";
ArrayFormula(trim(split(regexreplace(REGEXREPLACE(transpose(query(query({
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0) },
"select max(Col1) where Col2 <>'' group by Col1 pivot Col2",0)
,,99^99)),
"♦️[0-9 ]+" , ", "),
"(.*),", ""),
"♥️",0)))}
此 return 是一组 JobID 和用户,以逗号分隔。它还包括 header 标签 要添加用户数,按照您显示的格式,我隐藏了用户列,添加了一个计算用户数的列,然后添加了一个以下列复制了隐藏的用户列。如果您愿意,还有很多其他方法可以做到这一点。
下一个关键问题是,如果公式包含没有选项卡的用户(Users 中的一行),并且其中包含 JobID 作为数据,则公式将失败。有几种解决方法。
一种是额外的选项卡(20 个或您的最大用户数量),给它们命名,如 TEMP1、TEMP2 等,并在每个选项卡中有一个 JobID 作为填充符,值为 999999 或类似值。然后主公式查询可以排除具有该 JobID 的记录。这意味着每个用户查询总是 return 至少一个数据行,JobID 999999,并且不会失败。
当您获得新用户时,只需将用户选项卡中的 TEMP1 替换为他们的真实姓名,并将 TEMP1 选项卡重命名为他们的名字。
可能有其他错误检查可以防止这种情况,但我发现如果一个查询 return 没有行,堆叠多个查询会给我一个错误。例如:
{ query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........) }
如果 User!A2
为空, 或 则出现错误 User!A2
, 中没有与名称匹配的选项卡]或具有该名称的选项卡没有数据。
如果采取这些措施,则可以预设主要公式来处理二十个(或更多)用户。我上面显示的公式适用于当前的六个用户,但我已经用更多用户对其进行了测试。我会在底部提供二十个用户的公式。
如果这对您有帮助,或者您有任何疑问,请告诉我。很高兴回答他们。
二十个用户的公式。每个“用户”都有一个名字,或者一个虚拟名称占位符,在用户中,必须有一个带有该名称的选项卡,并且每个选项卡中必须至少有一个 JobID 值,或者一个虚拟的 JobID,可能像 999999。
={"Job ID","Users (hidden)";
ArrayFormula(trim(split(regexreplace(REGEXREPLACE(transpose(query(query({
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0) },
"select max(Col1) where Col2 <>'' group by Col1 pivot Col2",0)
,,99^99)),
"♦️[0-9 ]+" , ", "),
"(.*),", ""),
"♥️",0)))}
我只从 Google 电子表格中的每个用户 Sheet 提取 JobID 列。我想查询哪些用户正在使用相同的 JobID。我还需要将用户名列为查询的列,因为该列不存在于每个用户 Sheet 中,尽管 Sheet 名称是用户名。有没有办法使用 Google 查询来做到这一点? 例如
JobID | Count | Users using it |
----------------------------------------------------
1001 | 3 | alex, hubert, mark |
1002 | 1 | mark |
1003 | 2 | sally, chaz, maha |
1004 | 1 | hubert |
1005 | 2 | maha, mark |
P.S:此外,Sheets 可以重命名为其他用户。所以需要一些动态的东西。
这里是 link 到 Sample file。
像下面这样的东西行得通吗? 它动态地将 sheet 名称从“用户”选项卡中提取到“查询”。我想您还想先从该用户选项卡中删除报告和用户名。
这个在Report的C2里面,目前需要往下拖。我看看能不能想出一个数组公式。
=TEXTJOIN(", ",1,
{IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,""),
IF(COUNTIF(INDIRECT(USERS!A & "!A:A"),A2),USERS!A,"") })
我只允许 6 个用户,但可以扩展到处理 10 到 20 个用户,使用 IF 或 IFERROR 测试来避免在任何时候“用户”选项卡中的用户较少时出现问题。
如果您对此有任何疑问,请告诉我。
更新#1 以下是扩展为允许 20 个用户的公式。只要将它们添加到 Users!A1:A20 中的任何位置,并且它们的 sheet 名称与其列出的名称相匹配,它们的值就会被包含在内。如果您发现任何问题,请告诉我。我仍然会尝试看看它是否可以变成一个数组公式。
=textjoin(", ",1,
{if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,""),
if(countif(indirect(Users!A & "!A:A"),A2),Users!A,"")})
根据您的意见,我得到了 return JobID 和用户的单一公式。但是为了包括用户数量,我不得不添加另一列和公式。见下文:
D1中的关键公式如下:
={"Job ID","Users (hidden)";
ArrayFormula(trim(split(regexreplace(REGEXREPLACE(transpose(query(query({
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0) },
"select max(Col1) where Col2 <>'' group by Col1 pivot Col2",0)
,,99^99)),
"♦️[0-9 ]+" , ", "),
"(.*),", ""),
"♥️",0)))}
此 return 是一组 JobID 和用户,以逗号分隔。它还包括 header 标签 要添加用户数,按照您显示的格式,我隐藏了用户列,添加了一个计算用户数的列,然后添加了一个以下列复制了隐藏的用户列。如果您愿意,还有很多其他方法可以做到这一点。
下一个关键问题是,如果公式包含没有选项卡的用户(Users 中的一行),并且其中包含 JobID 作为数据,则公式将失败。有几种解决方法。
一种是额外的选项卡(20 个或您的最大用户数量),给它们命名,如 TEMP1、TEMP2 等,并在每个选项卡中有一个 JobID 作为填充符,值为 999999 或类似值。然后主公式查询可以排除具有该 JobID 的记录。这意味着每个用户查询总是 return 至少一个数据行,JobID 999999,并且不会失败。
当您获得新用户时,只需将用户选项卡中的 TEMP1 替换为他们的真实姓名,并将 TEMP1 选项卡重命名为他们的名字。
可能有其他错误检查可以防止这种情况,但我发现如果一个查询 return 没有行,堆叠多个查询会给我一个错误。例如:
{ query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........);
query(indirect(Users!A & "!A:A").........) }
如果 User!A2
为空, 或 则出现错误 User!A2
, 中没有与名称匹配的选项卡]或具有该名称的选项卡没有数据。
如果采取这些措施,则可以预设主要公式来处理二十个(或更多)用户。我上面显示的公式适用于当前的六个用户,但我已经用更多用户对其进行了测试。我会在底部提供二十个用户的公式。
如果这对您有帮助,或者您有任何疑问,请告诉我。很高兴回答他们。
二十个用户的公式。每个“用户”都有一个名字,或者一个虚拟名称占位符,在用户中,必须有一个带有该名称的选项卡,并且每个选项卡中必须至少有一个 JobID 值,或者一个虚拟的 JobID,可能像 999999。
={"Job ID","Users (hidden)";
ArrayFormula(trim(split(regexreplace(REGEXREPLACE(transpose(query(query({
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0);
query({ Users!A & "♦️" & row(indirect(Users!A & "!A:A")), indirect(Users!A & "!A:A")&"♥️"}, "where Col2<> '♥️'",0) },
"select max(Col1) where Col2 <>'' group by Col1 pivot Col2",0)
,,99^99)),
"♦️[0-9 ]+" , ", "),
"(.*),", ""),
"♥️",0)))}