【问题标题】:google sheets query not able to transpose谷歌表格查询无法转置
【发布时间】:2021-08-17 11:00:03
【问题描述】:

谁能告诉我为什么这个公式不起作用

=ARRAYFORMULA
(
   IF(isblank(H:H),"",IF(ROW(H:H)=5,"Previous meets",QUERY(mainDB2021!A:P,"select H WHERE D="&H6:H10000&"",0)))

)

sheets link

谢谢

【问题讨论】:

  • 它离我很近,但不是我要找的。我需要根据当前日期获取上一次访问 cmets 。您共享的链接列出了所有联系电话和所有 cmets。这对索引很有用,但不能解决我的问题。
  • 如果不接受超过 3 个部分,这里有更多 IF(isblank(H:H),"",IF(ROW(H:H)=5,"Previous meets", 。你的公式在哪里?无论如何,请给我们一个可重复的最小电子表格。
  • 我使用了嵌套的 if 。给出了工作表的链接,子工作表的名称是daily_log

标签: google-sheets


【解决方案1】:

我创建了一个新工作表(“daily_log_Erik”)。在那里,我从 I 列中删除了您的所有公式,并用 I5 中的一个数组公式替换它们:

=ArrayFormula({"Previous Meets"; IF(A6:A="",, IFERROR(VLOOKUP(F6:F,FILTER(mainDB2021!D:H,INT(mainDB2021!A:A)<>A1),5,FALSE),"--"))})

我相信这就是你想要做的。

由于您的 mainDB2021 工作表目前不包含 8 月 11 日之后的任何数据,您可以通过简单地将 A1 公式从 =TODAY() 修改为 =TODAY()-7(或减去一些其他会导致的数字)来测试我的公式在您确实有数据的日期)。

本质上,该公式只是在FILTERed 的mainDB2021 工作表数据版本中从当前工作表中查找电话号码,以删除daily_log 工作表中的目标日期。这样,VLOOKUP 将始终从下一个最近的日期找到该条目。如果没有找到,IFERROR 将返回两个破折号,表示没有找到之前的日期。

您的工作表当前处理速度非常缓慢。这是因为您在原始 daily_log 工作表和名为 Copy_of_daily_log 的工作表中都有超过 50k 行。 (这种多余的行通常意味着在这些工作表中创建数组公式的尝试失败。)尽管如此,公式仍在尝试处理所有这些空白行,因此它们大大减慢了速度。您会注意到我自己的新工作表只有 100 行。如果我的解决方案如您所愿,您只需删除原来的daily_log 工作表和Copy_of_daily_log 工作表,然后将daily_log_Erik 重命名为daily_log

【讨论】:

  • 嘿,erik,您的公式公式有效,但有一个小问题。我需要获取所有以前访问的数据。在您的解决方案中,它仅显示以前访问的单个条目。我已经从头到尾检查过了。如果我们从 8 月 17 日开始进入,Akshat Mishra 的访问是他的第三次访问,但在您的工作表中仅显示 1 次访问
  • 您的帖子提供的信息非常有限。我根据有限的信息编写了一个公式。虽然您尝试做的事情是可能的,但它超出了志愿者捐赠时间运行的免费论坛所能提供的范围。也就是说,编写您想要的那种公式需要专家(我就是)和时间投资,这将构成我所说的“真正的工作”(我不能在这里提供)。没有论坛旨在免费提供定制的专家级工作。欢迎您再次发帖并尝试。但你可能需要雇人。
【解决方案2】:

经过一些艰苦的尝试制定公式后,我无法通过表格公式解决它。

看到您上面有一个脚本,我尝试创建一个脚本。我能够将预期的结果输出到特定的单元格中,请检查。

代码:

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var mainDBsheet = ss.getSheetByName("mainDB2021");
  var numberRange = mainDBsheet.getRange("D2:D");
  var numberValues = numberRange.getDisplayValues().filter(String).flat();
  var meetRange = mainDBsheet.getRange("H2:H");
  var meetValues = meetRange.getDisplayValues().filter(String).flat();

  var dailySheet = ss.getSheetByName("daily_log");
  var dailyRange = dailySheet.getRange("F6:F");
  var dailyValues = dailyRange.getDisplayValues().filter(String).flat();

  // iterate daily_log!F6:F
  dailyValues.forEach(function (dailyNumber, index1){
    var matches = [];
    // iterate mainDB2021!D2:D
    numberValues.forEach(function (number, index2){
      // if mainDB2021!D2:D == the current daily_log!F6:F
      // save its mainDB2021!H2:H for later
      if(dailyNumber == number) 
        matches.push(meetValues[index2])
    });
    // all saved mainDB2021!H2:H are to be written per row as bulk
    dailySheet.getRange(index1 + 6, 9, 1, matches.length).setValues([matches]);
  });
}

输出:

注意:

  • 由于每行的行长度不同,因此不可能通过单个setValues 输出它们。 reference
  • 尝试将其作为自定义公式,返回多维数组似乎很慢。我改用这种方法,因为它更快。
  • 在应用脚本的项目设置下勾选Enable Chrome V8 runtime

【讨论】:

  • 您好,您的代码在 flat() 的第 5 行显示错误
  • 嗨@tinkershukla,您需要在应用脚本的项目设置中勾选“启用 Chrome V8 运行时”。我编辑了上面的答案以显示它的样子。
  • 嗨@tinkershukla,如果这回答了您的问题,请单击左侧的接受按钮(复选图标)。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。如果您无法使用接受按钮,请随时告诉我。 how to accept answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多