【问题标题】:Fill cell based on another sheets value根据另一个工作表值填充单元格
【发布时间】:2019-10-17 00:08:59
【问题描述】:

我在 Google 工作表上有一个电子表格,其中有 2 个工作表,Sheet1Sheet2。在 Sheet1 上,我有 2 列(ID1Result1),其中已填充。在 Sheet2 上,我有 2 列(ID2Result2),其中填充了 ID2,而 Result2 填充了单词“empty”。

我的真实电子表格中的 Sheet1 正在从 Google 表单中获取数据,因此每次 Sheet1 收到 ID1 和 Result1 上的值时,它应该在 Sheet2 的 ID2 上搜索 ID1 值,并在查找时将 Result1 值粘贴到 Result2 的行中找到了。

Result2 只有在 Sheet1 上有新数据从表单提交时才会更新。

我创建了这个可编辑的表单和电子表格以使其更易于理解(我还在其中添加了一个解释它的注释)。你可以看到here的表格和here的电子表格。

【问题讨论】:

  • 经过长时间的讨论,我想你“忘了”提到你不想在Sheet2 上使用公式来返回匹配的结果,而是假设会有一个事件这将触发查找过程并自动使用来自Sheet1 的结果填充您的Sheet2。如果是这种情况,您在使用 Google 表格宏(或 excel 中的 vba)。逻辑是识别触发事件,指定覆盖Sheet2 上的值的方式和位置。如果是这样,您可能需要将#google-sheets-macros 添加到此帖子的标签中。

标签: google-apps-script google-sheets google-sheets-formula array-formulas gs-vlookup


【解决方案1】:

在第二张表格的单元格B2 中,我输入了以下内容:

=VLOOKUP(A2,Sheet1!A:B,2,FALSE)

我猜 Google-Sheets 上的 VLOOKUP 是否允许跨工作表进行引用?

仅供参考,在输入公式时,输入第一个参数作为您的查找条件后,您可以单击您的 sheet1 并突出显示 A 和 B 列,然后返回您的 sheet2(第二个参数由系统自动填充) 以第三个(查找范围内的结果范围列位置)和第四个参数(TRUE 用于近似匹配,FALSE 用于精确匹配)完成公式,然后按 Enter 退出公式。

【讨论】:

  • 对不起!我没有解释对。我的真实电子表格中的 Sheet1 正在从 Google 表单中获取数据,因此每次 Sheet1 在 ID1 和 Result1 上收到一个值时,它应该在 Sheet2 的 ID2 上搜索 ID1 值,并在查找时将 Result1 值粘贴到 Result2 中找到的行中。
  • @Luiz 无论您的数据如何在 Sheet1 上更新,您始终可以使用 VLOOKUP 从 Sheet1 中查找 ID2 以返回相应的结果。我不确定这里真正的问题是什么?
  • 用表格更新了。另外我忘了提到 result2 实际上不是空的,它有一个值(在这种情况下,说“空”),所以我不能在那里有一个公式,它只会在有新数据时更新表单中的 Sheet1。
  • @Luiz 如何用这个公式=IFERROR(VLOOKUP(A2,Sheet1!A:B,2,FALSE),"empty") 替换Result2 中的硬编码值,所以如果没有匹配,Result2 将显示empty,否则它将返回最无论您的 Sheet1 何时更新,您的 Sheet1 的当前结果。
  • 但是这样就不能编辑了。例如,如果我们将 ID1 提交为 400,将 Result1 提交为 result100,它会在 ID2 中查找 400,并将 Result2 中的 result100 粘贴到 ID 匹配的同一行中,但是当有人尝试将 result100 编辑回“空”时,它'会报错:(
【解决方案2】:

在浏览了当前的答案和 cmets 之后,我想我明白你在寻找什么。

答案:

您可以在 Google Apps 脚本中执行此操作,方法是创建一个绑定到您的 Google 表单的函数,该函数收集最新响应并进行数据处理,并使其在表单提交时运行。 p>

采取的步骤:

首先,在您的表单上,您需要创建一个绑定脚本。在表单编辑页面右上角的菜单中,点击⋮ > Script editor,这将打开一个新的脚本页面。

您可以从那里制作一个自动为您执行此操作的脚本,并制作一个可在您需要时运行的可安装触发器。

代码:

打开脚本编辑器后,你会看到一个可以编辑的函数,如下所示:

function myFunction() {

}

用以下代码替换整个脚本:

function onSubmit(e) {
  var responses = FormApp.getActiveForm().getResponses();
  var response = responses[responses.length - 1].getItemResponses();
  var connectedSheet = SpreadsheetApp.openById('<your-sheet-id>').getSheets();
  var sheet2 = connectedSheet[1];  
  var result2Column = sheet2.getRange('A1:A').getValues();
  
  for (var i = 0; i < result2Column.length; i++) {
    if (response[1] == result2Column[0]) {
      sheet2.getRange('B' + (i +1)).setValue(response[0]);
    }
  }
}

确保将 &lt;your-sheet-id&gt; 替换为您的 Google 表格的唯一 ID - 您可以在表格的网址中 d//edit 之间找到它,如下所示:

https://docs.google.com/spreadsheets/d/<your-sheet-id>/edit

按播放按钮 (►) 运行脚本并授权应用程序运行。

然后转到Edit -&gt; Current Project's Triggers 并使用以下设置设置新的可安装触发器:

  • 选择要运行的函数:onSubmit
  • 选择应该运行的部署:Head
  • 选择事件源:From form
  • 选择事件类型On form submit

说明:

此脚本将在每次自动提交新表单时运行 - 它会从表单响应中获取 ID 并在 Sheet2 中搜索它。如果找到,则对 result 的响应也将放在 Sheet2 中,在相应的 ID 旁边。

参考资料:

【讨论】:

    【解决方案3】:

    简单地这样做:

    =ARRAYFORMULA(IFERROR(VLOOKUP(A2:A, Sheet1!A:B, 2, 0)))
    



    或通过复选框重置:

    【讨论】:

    • 真的很抱歉!正如我在上面向特里解释的那样,在我的真实电子表格中 Sheet1 正在从 Google 表单中获取数据,因此每次 Sheet1 收到 ID1 和 Result1 上的值时,它应该在 Sheet2 的 ID2 上搜索 ID1 值,并在查找时将 Result1 值粘贴到 Result2在找到它的行中。
    • 您能否在工作表中提供所需输出的示例?
    • 我用新的电子表格和表格更新了这个问题,所以它更像是真实的。
    • 单元格上不能有公式,因为单元格需要可编辑。如果我在里面写任何东西,它会给我一个错误。
    • 比如上面的例子,当Result2的值为result100时,有人会再次手动将其编辑为“空”。如果我现在这样做,它会给我一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多