【发布时间】:2019-06-01 18:57:02
【问题描述】:
我有两个谷歌电子表格,一个主副本和一个子副本。当我更新主副本中的公式时,我希望它也更新子副本中的公式。我打算创建子副本的许多副本,并且不想每次必须更改一些小的东西时都更新每个副本中的公式。
我试过使用 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 类的不同方法,我开始感到头疼。我看不到任何方法可以做到这一点,但我觉得我错过了一些东西。还有其他想法吗?
编辑 3: 好的。我想出了一个解决方法。基本上我所做的是使用 sheet.copyTo() 函数将整个工作表从一个电子表格复制到另一个电子表格。然后,我使用 range.copyTo() 来获得我想要的东西。然后我使用 sheet.deleteSheet() 删除了复制的工作表
【问题讨论】:
-
这是一个谷歌电子表格。
-
在此站点上的解决方案应作为答案而不是问题编辑发布。
标签: javascript google-apps-script google-sheets google-sheets-formula custom-function