从另一个Google电子表格动态更新公式

时间:2019-06-01 18:57:03

标签: javascript google-apps-script google-sheets google-sheets-formula custom-function

我有两个Google电子表格,一个主副本和一个子副本。当我更新主副本中的公式时,我也希望它也更新子副本中的公式。我打算创建子副本的许多副本,并且不想每次都必须更改一些较小的值时更新每个副本中的公式。

我尝试使用IMPORTRANGE(),它只给我值,而不是公式。因此,我想创建自己的脚本来完成此任务。我正在使用以下代码进行尝试:

function REMOTEDATA(inKey, inRange) {

  var outData;  
  var ss = SpreadsheetApp.openById(inKey);

  if (ss) {
     outData = ss.getRange(inRange).getFormulas();
  }

  return outData;
}

//My manifest is the following:
{
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets"
  ],
  "timeZone": "America/Denver",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}

我是oAuth的新手,我不知道该如何使用它。当我尝试这样做时,它会给我以下内容:

“您无权调用SpreadsheetApp.openById。所需权限为https://www.googleapis.com/auth/spreadsheets(第4行)。”

谁能告诉我要使其正常工作需要添加什么?如果有更简单的方法,我会全力以赴。

编辑: 阅读下面的鲁本评论后,我将操作方式更改为在工作表上设置一个按钮即可运行该功能。它解决了第一个问题,但现在我遇到了另一个问题。我无法将所有数据直接从一张纸复制到另一张纸。我正在尝试获取公式,值和格式。如果我仅将getFormulas()和setFormulas()与范围一起使用,它将摆脱不是公式的所有值,并且不会更改格式。我一直在尝试使用copyTo(),但它告诉我在电子表格之间无法执行此操作。我当前的代码是:

function REMOTEDATA() {

  var MASTERKEY = "key";
  var UPDATERANGES = ["A1:B200", "C7:C200", "D1:H200", "J1:L200", "N1:S200", "U1:X200", "z1:ac200", "AE1:AH200", "AJ1:AL200"];

  var ss = SpreadsheetApp.openById(MASTERKEY);
  var cur_ss = SpreadsheetApp.getActiveSpreadsheet();

  UPDATERANGES.forEach(function(range) {

    data = ss.getRange(range).copyTo(cur_ss.getRange(range));


  });
}

看着Ranges类的不同方法,我的头开始受伤。我看不到任何执行此操作的方法,但感觉好像缺少了一些东西。还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

自定义函数匿名运行,因此它们无法调用需要授权的服务,例如openById

不是使用自定义函数来执行脚本,而是使用其他方法(如自定义菜单),将脚​​本分配给图像等,或者只是从脚本编辑器中运行它。

注意:您将不得不稍微修改脚本或使用另一个函数来传递所需的参数。