6

我在将信息提取到数据库的工作表上有一些查询。

我遇到的问题是实现的代码很好,直到某些工作表不会显示显示以下内容的查询:“警告:可能不会显示这些结果中的一个或多个条目。选择 ctrl+Shift+E 显示它们。

我尝试清除值并将它们粘贴回来无济于​​事。

我还可以做些什么?

4

1 回答 1

6

恕我直言,我不认为这个问题有一个规范的答案 - 用户总是围绕某些主题大声喧哗,这只会消散到谷歌文档工程团队的诡异沉默中(这个问题似乎笼罩在与 IMPORTRANGE 经常失败或 SPLIT 无法创建完美矩阵相同的永恒之谜)。

我自己也被这个咬过好几次了,所以有一些经验。我使用了一种对我有用的 heath-robinson 解决方法。但是YMMV。

OP的问题讨论了有一个公式运行良好的情况,但经过一段时间的操作,开始出现Ctrl+Shift+E的情况。

(在其他情况下,由于一个公式试图覆盖另一个公式写入的单元格的结果,可能会出现 Ctrl+Shift+E。在这种情况下,有时在所需公式的开头添加 EXPAND 可以解决问题。也使用过滤器函数,而不是“IF”比较,会清除先前的 =CONTINUE(1,2,3) 单元格……但也许这些都不可能对 OPs 问题有帮助)。

根据我的经验,随着时间的推移,电子表格可能会出现这种“混乱”的行为,因此需要 Ctrl+Shift+E,这意味着在一段时间内多次使用电子表格会导致数据发生变化。我可能会进一步推测,当引用的数据更加动态时,这种混淆行为的可能性更大,例如添加的行、删除的行或者还有其他公式也从同一数据集计算(更不用说这两个公式相关了)对彼此)。

我认为“混淆行为”这个成语是合适的,因为电子表格的实际工程对谷歌工程师来说是一个开放的盒子;我们无法使其运作合理化。因此,在 OP 的案例和我的经验中,电子表格运行良好,但随后改变行为以要求 Ctrl+Shift+E 而公式没有任何变化,仅在工作表的累积数据变化中,这似乎是神秘而神奇的通过使用。

我正在使用我的示例案例来举例说明我的解决方法。请注意,在我的情况下,数据和有问题的公式都在一张表中,我称之为生产表

解决方法涉及使用脚本在与生产表相同的电子表格中复制“模板表”。模板表在结构上与具有相同列标题的生产表相同,但只有几行示例数据。与生产表的公式相同,都是参考同一个模板表中的样本数据(不是生产表)。重要的是,模板表没有显示“混淆行为” - 如果模板的示例数据有任何更改,公式单元格中不需要 Ctrl+Shift+E。它还包含生产表的形成。

因此,当脚本运行时,它会创建模板表的副本;它随后将生产表的数据复制到此模板副本并重新应用格式。此副本成为新的生产表。旧的生产表是隐藏的(在我的情况下,但可以删除)。

我让这个系统在每天有 12 个人使用的任务列表电子表格上运行,其中任务全天通过谷歌表单进入(并且它们自己被另一个脚本复制到生产表中,未显示为与此 OP 无关) . 任务完成后,该任务所在的行将从生产工作表中删除。因此,数据在一天中不断增长和缩小。通过 insertSheet() 函数的定时触发器,每晚都会创建重复的工作表。这是我使用的脚本:

function insertSheet(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet =ss.getSheets()[0]; //first sheet is the production sheet
  var sheetRange = sheet.getRange('A3:P');
  var sheetValues= sheetRange.getValues();
  var d = Utilities.formatDate(new Date(), Session.getTimeZone(), 'ddMMMyyyy-hh:mm:ss');
  var ex = sheet.setName('CCEs' + d);
  var templateSheet = ss.getSheetByName('templateSheet');
  var s2 = ss.insertSheet(0,{template: templateSheet});
  var height = sheetRange.getHeight();
  s2.insertRowsAfter(2, height)
  s2.setName('CCEs');
  templateSheet.hideSheet();
  ex.hideSheet();
  s2.getRange('A3:P' + (sheetValues.length+2)).setValues(sheetValues);
  format(); //
  templateSheet.hideSheet();
  ex.hideSheet();
}

function format(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var formatRange = ss.getSheetByName('templateSheet').getRange('B2:N2').copyTo(ss.getSheetByName('CCEs').getRange(2,2, ss.getSheetByName('CCEs').getMaxRows() -1,14), {formatOnly:true});
}

在部署此策略之前,电子表格会在几天左右后经历“混乱行为”。

该表包含三个公式,这些公式会变得混乱。它们对 OP 来说并不重要,但我在这里复制只是为了让读者对这种策略的成功有一种感觉:

=arrayformula(IFERROR(FILTER(if(row(O:O) =1,"Auto Time Stamp ",iferror(1/0)) &O:O&if(row(O:O) =1,"copy",),len(A:A)),"Error"))

=Arrayformula(iferror(if(filter(L:L, len(A:A)) - filter(A:A, len(A:A))>0, if( int(filter(L:L, len(A:A)) - filter(A:A, len(A:A))) = 0 , text( text(filter(L:L, len(A:A)), "HH:mm") -text(filter(A:A, len(A:A)), "HH:mm") , "H:mm") , int(filter(L:L, len(A:A)) - filter(A:A, len(A:A))) & "Day(s), " & text( text(filter(L:L, len(A:A)), "HH:mm") -text(filter(A:A, len(A:A)), "HH:mm") , "H:mm") ) ,iferror(1/0)),"Time Taken"))

=arrayformula( IFERROR(if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Normal")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A1 )),"OVERDUE Normal", if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Urgent")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A2 )),"OVERDUE Urgent", if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Very Urgent")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A3 )),"OVERDUE V. Urgent", IFERROR(1/0)))),countif(if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Normal")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A1 )),"OVERDUE Normal", if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Urgent")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A2 )),"OVERDUE Urgent", if((ISBLANK(FILTER(J1:J,LEN(A1:A))) * (FILTER(G1:G,LEN(A1:A)) = "Very Urgent")* (now()-FILTER(A1:A,LEN(A1:A))> OverdueTimings!A3 )),"OVERDUE V. Urgent", iferror(1/0)))),"OVERDUE *")& " OVERDUE"))

几天后,我们删除了所有积累的旧生产表。

于 2013-07-11T11:37:43.743 回答