google-apps-script - 刷新单元格,而不是手动按ctrl-Shift-E

标签 google-apps-script google-sheets

我在工作表上有几个查询,在这些查询中我将信息提取到数据库中。

我的问题是,在某些工作表无法显示查询之前,实现的代码是正确的:“警告:可能不会显示其中一个或多个结果条目。选择ctrl + Shift + E可以显示它们。

我尝试清除值并将其粘贴回无济于事。

我还可以做些什么?

最佳答案

恕我直言,我认为这个问题没有一个规范的答案-使用者一直围绕某些主题大声疾呼,只是消散了Google文档工程团队的怪异沉默(这个问题似乎笼罩在与IMPORTRANGE经常失败或SPLIT无法创建完美矩阵相同的永恒谜团)。

我已经被自己咬过好几次了,所以有一些经验。我使用了希思·罗宾逊的解决方法,对我有用。但是YMMV。

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

(在其他情况下,由于一个公式试图覆盖另一个公式所写的单元格,因此可能会发生Ctrl + Shift + E。在这种情况下,有时在所需公式的开头添加EXPAND可以达到目的。函数,而不是“IF”比较,会删除以前的= CONTINUE(1,2,3)单元格……但也许这两个都不大可能对OP问题有所帮助)。

以我的经验,电子表格可能会随着时间的推移而出现这种“困惑”的行为,因此需要Ctrl + Shift + E,这意味着一段时间内会有多种电子表格用途导致数据更改。我可能会进一步推测,当引用的数据更具动态性(例如,添加了行,删除了行,或者还有其他公式也可以从同一数据集中计算出来(更不用说这两个公式彼此相关)。

我认为习惯用法“混淆行为”是适当的,因为电子表格的实际工程设计仅对Google工程师开放。我们无法使其运作合理化。因此,在OP的情况下和我的经验看来,电子表格运行良好似乎是神奇而神奇的,但是随后更改了行为以要求Ctrl + Shift + E,而公式中没有任何更改,仅在工作表的累积数据更改中通过使用。

我使用我的示例案例给出了解决方法的示例。请注意,在我的情况下,数据以及有问题的公式都在一个工作表中,我称之为生产工作表

解决方法是在与生产工作表相同的电子表格中,使用脚本来复制“模板工作表”。模板表在结构上与具有相同列标题的生产表相同,但只有几行样本数据。它具有与生产单相同的公式,这些公式引用相同模板模板中的样本数据(而不是生产单)。重要的是,模板表未显示“混淆行为”-如果模板的样本数据有任何更改,则公式单元格中不需要Ctrl + Shift + E。它还包含生产表的格式。

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

我可以在每天有12个人使用的“任务列表”电子表格上运行此系统,其中任务全天以google形式出现(并通过另一个脚本自身复制到生产表中,没有显示与此操作无关) 。任务完成后,该任务的行将从生产表中删除。因此,数据全天不断增长和收缩。通过在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"))

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

关于google-apps-script - 刷新单元格,而不是手动按ctrl-Shift-E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001688/

相关文章:

google-apps-script - Google Apps Script - 将数据复制到不同的工作表并附加

html - 从工作表填写侧边栏表单

javascript - Google Apps 脚本 : Function running twice from . showModalDialog 表单提交

google-apps-script - Google App Script Add-Ons createAddonMenu() 创建帮助菜单。怎么称呼呢?

django - 在网页中嵌入可编辑的 Google 文档电子表格

google-sheets - 如何按公式在电子表格中自动递增?

google-sheets - 获取一列用逗号分隔的值的计数和唯一值?

google-apps-script - 所需权限 : https://www. googleapis.com/auth/spreadsheets

google-apps-script - 在 Google 表单中验证电子邮件地址

google-sheets - 有没有办法检索电子表格中最右边的非空单元格?谷歌表格