将公式不是值从主表推送到子表 我的问题是:问题:说明和参考

问题描述

我的问题是:

  1. 我有各种各样的人员将数据输入到表格中。每个员工都有自己的电子表格副本,但是所有员工的公式都相同。
  2. 当我需要更新公式时非常痛苦,因为这需要我在每个电子表格中更新公式。

问题:

我是否有办法拥有一个仅包含将推到每个电子表格的公式的主电子表格?因此,我只需要更改主文件即可自动更新子电子表格中的公式。

我试图在互联网上寻找它,但这似乎是不可能的。之前在Stack Overflow中也曾问过这个问题,答案是“不可能”。我想再次询问,希望对此问题有一个新的解决方案。

以下是一些电子表格示例:

  1. 这是具有以下公式的主电子表格的链接https://docs.google.com/spreadsheets/d/1UTICzoDWt8rU8csZWVB7pHcsyMkf_jQDNFQ0kxuvxC4/edit?usp=sharing

  2. 这是示例子电子表格的链接https://docs.google.com/spreadsheets/d/12nmW4FRCYSb-7YrVeRgstGpB_FYRlYTlvTb1nQfdjc4/edit?usp=sharing

黄色单元格是我放置公式的单元格。

绿色单元格是员工存放数据的单元格。

解决方法

简介

下面有一个您可以自行配置的脚本,尽管它确实涉及一些设置,所以我尝试了尽可能完整地列出说明。

  • 您将需要能够获取所有员工的工作表ID。可以在每个工作表的URL中找到。
https://docs.google.com/spreadsheets/d/{HERE IS THE ID}/edit#gid=0

这将是一长串随机字符。

  • 您还需要具有编辑权限或成为所有图纸的所有者。
  • 您可以将母版表保密。
  • 请注意quotas。可以使用,但如果子表很多,则可能会遇到配额限制。

建议的解决方案

  1. 打开您的母版纸。
  2. 转到“工具”>“脚本编辑器”
  3. 用以下代码替换空函数:
function updateFormulas(e) {
  
  // Here insert the INDIVIDUAL ranges of all the cells
  // that will contain formulas you want to move across
  var formulaRanges = ["A2","B2"]

  // Here list the names or IDs of employees with
  // the corresponding ID of the Sheet.
  var childSheets = {
    user1: "YOUR 1st CHILD ID HERE",user2: "YOUR 2nd CHILD ID HERE"
  }

  // If you want to change your sheet name,change it here
  var sheetName = "Sheet1"
  
  try {
    var ss = e.source.getActiveSheet().getName()
    var rng = e.range.getA1Notation()
    var formulaToSet = e.range.getFormula()
    
    if (ss == sheetName && formulaRanges.includes(rng)) {
        for (const user in childSheets) {
          var userSheet = SpreadsheetApp.openById(childSheets[user])
          userSheet.getRange(rng).setFormula(formulaToSet)
        }
        
      }
  } catch (err) {Logger.log(err)}
}

function install() {
  var sheet = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("updateFormulas")
  .forSpreadsheet(SpreadsheetApp.getActive())
  .onEdit()
  .create();
}
  1. 在菜单中,单击“查看”>“显示清单文件”。
  2. 打开出现在左侧“ appsscript.json”中的文件。
  3. 添加oauthScopes部分:
{
  "timeZone": "Europe/Paris","dependencies": {
  },"exceptionLogging": "STACKDRIVER","runtimeVersion": "V8","oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets"
  ]
}
  1. 返回原始脚本文件。
  2. 您应该看到这样的下拉框:

function selector

  1. 选择updateFormulas,然后按“播放”按钮,该脚本将运行。
  2. 它应该要求您授予权限,授予它们。
  3. 然后选择install并运行它,您只需要运行一次。
  4. 使用要推送到子电子表格的每个公式的范围以及要推送到的每个工作表的用户和ID配置updateFormulas函数。这部分:
  // Here insert the INDIVIDUAL ranges of all the cells
  // that will contain formulas you want to move across
  var formulaRanges = ["A2",change it here
  var sheetName = "Sheet1"
  1. 通过更改主表中的公式进行测试,并观察其传播!

说明和参考

  • 该脚本使用了installable onEdit trigger。每当您在工作表上进行编辑时,此操作就会运行。它将检查编辑是否在“ Sheet1”上,以及该编辑是否在“ formulaRanges”中定义的范围内。如果这些都是正确的,那么它将把编辑后的范围复制到子表格中。
  • 它使用详细的here方法读取,比较和编写公式。例如:
,

使用以下代码将公式添加到所有单元格中:

function insformula() {
  var ss = SpreadsheetApp.getActive();
  var master = SpreadsheetApp.openById('ID');
  var staff = SpreadsheetApp.openById('ID');
  var masterrange = master.getRange('A1:B');
  var staffrange = staff.getRange('B1:B');
  var lastrow = staff.getLastRow();
  var formula = masterrange.getValues();
  staff.getActiveSheet();
  staffrange.clearContent();
  for (i = 2; i <= lastrow; i++) {
    staff.getRange("B" + i).setFormula('=(if(A2:A=\"\",SUMIF(D2:D,A2:A,E2:E)))');

  };
};

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...