从另一个 Google 电子表格动态更新公式
Dynamically Updating Formulas From Another Google Spreadsheet
我有两个 google 跨页sheet,一个主副本和一个子副本。当我更新主副本中的公式时,我希望它也更新子副本中的公式。我打算创建子副本的许多副本,并且不想在每次必须更改小内容时更新每个副本中的公式。
我试过使用 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 的新手,我不知道如何让它工作。当我尝试这样做时,它给了我以下信息:
"You do not have permission to call SpreadsheetApp.openById. Required permissions: https://www.googleapis.com/auth/spreadsheets (line 4)."
任何人都可以告诉我需要添加什么才能让它工作吗?如果有更简单的方法,我洗耳恭听。
编辑:
阅读下面 Ruben 的评论后,我改变了我的做法,在 sheet 本身 运行 函数上设置了一个按钮。它解决了第一个问题,但现在我 运行 遇到了另一个问题。我无法将所有数据直接从一个 sheet 复制到另一个。我正在尝试获取公式、值和格式。如果我只是将 getFormulas() 和 setFormulas() 与范围一起使用,它会删除所有不是公式的值,并且不会更改格式。我一直在尝试使用 copyTo() 但它告诉我我不能在 spreadsheet 之间执行此操作。我当前的代码是:
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));
});
}
看着范围的不同方法,我的头开始疼了 Class。我看不到任何方法可以做到这一点,但我觉得我错过了一些东西。还有其他想法吗?
编辑 3:
好的。我想出了一个解决方法。基本上我所做的是使用 sheet.copyTo() 函数将整个 sheet 从一个 spreadsheet 复制到另一个。然后我用 range.copyTo() 得到了我想要的。然后我使用 sheet.deleteSheet()
删除了复制的 sheet
自定义函数 运行 匿名,因此它们无法调用需要授权的服务,例如 openById
。
不要使用自定义函数来执行脚本,而是使用另一种方法,例如自定义菜单、将脚本分配给图像等,或者直接从脚本编辑器中运行它。
注意:您必须稍微修改脚本或使用另一个函数来传递所需的参数。
我有两个 google 跨页sheet,一个主副本和一个子副本。当我更新主副本中的公式时,我希望它也更新子副本中的公式。我打算创建子副本的许多副本,并且不想在每次必须更改小内容时更新每个副本中的公式。
我试过使用 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 的新手,我不知道如何让它工作。当我尝试这样做时,它给了我以下信息:
"You do not have permission to call SpreadsheetApp.openById. Required permissions: https://www.googleapis.com/auth/spreadsheets (line 4)."
任何人都可以告诉我需要添加什么才能让它工作吗?如果有更简单的方法,我洗耳恭听。
编辑: 阅读下面 Ruben 的评论后,我改变了我的做法,在 sheet 本身 运行 函数上设置了一个按钮。它解决了第一个问题,但现在我 运行 遇到了另一个问题。我无法将所有数据直接从一个 sheet 复制到另一个。我正在尝试获取公式、值和格式。如果我只是将 getFormulas() 和 setFormulas() 与范围一起使用,它会删除所有不是公式的值,并且不会更改格式。我一直在尝试使用 copyTo() 但它告诉我我不能在 spreadsheet 之间执行此操作。我当前的代码是:
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));
});
}
看着范围的不同方法,我的头开始疼了 Class。我看不到任何方法可以做到这一点,但我觉得我错过了一些东西。还有其他想法吗?
编辑 3: 好的。我想出了一个解决方法。基本上我所做的是使用 sheet.copyTo() 函数将整个 sheet 从一个 spreadsheet 复制到另一个。然后我用 range.copyTo() 得到了我想要的。然后我使用 sheet.deleteSheet()
删除了复制的 sheet自定义函数 运行 匿名,因此它们无法调用需要授权的服务,例如 openById
。
不要使用自定义函数来执行脚本,而是使用另一种方法,例如自定义菜单、将脚本分配给图像等,或者直接从脚本编辑器中运行它。
注意:您必须稍微修改脚本或使用另一个函数来传递所需的参数。