如何在 Google Sheet 上将公式从 "Parent Tab" 复制到 "Child Tab"
How to copy a formula from "Parent Tab" to "Child Tab" on Google Sheet
我正在我称为“模型”的“父选项卡”上做角色扮演角色表,在那里我掌握了我的公式。
我创建了第二个选项卡“Character1”和第三个选项卡“Character2”。但是当我尝试使用 =QUERY 或 =TEXTFORMULA 或其他任何东西时。它不会在实际电子表格上计算公式,它只是从“模型”选项卡中获取数据。
我唯一的方法实际上是 copy/past 我所有的公式,但如果我做错了,我每次都必须在每个电子表格中更正它。
是否可以有一个公式将单元格放在:
- 模式!AE58
并在每个选项卡中自动生成相同的公式:
- CHARACTER1!AE58
- CHARACTER2!AE58
- 等...
对不起,如果它模糊,我会尽力解释。
如果你的 sheet 被称为 MODELE
试试其他的 sheet 只是:
=MODELE!AE58
对于数组,它将是:
={MODELE!AE58:AE100}
也看看“命名范围”——也许您会发现它更方便
简单
尝试
function onEdit(e) {
var sh = e.source.getActiveSheet()
var rng = e.source.getActiveRange()
if (rng.getFormula() != '' && sh.getName() == 'MODEL') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sh => {
if (!~excl.indexOf(sh.getSheetName())) {
sh.getRange(rng.getA1Notation()).setFormula(rng.getFormula())
}
})
}
}
当您在 MODEL 中更改公式时,这也会在除排除的选项卡之外的其他选项卡中更改
多个
如果您通过将公式拖动到模型中来编辑它们 sheet,请使用此模型,它允许您一次编辑所有公式
function onEdit(e) {
var sh = e.source.getActiveSheet()
if (sh.getName() != 'MODEL') return;
for (var i = e.range.rowStart; i <= e.range.rowEnd; i++) {
for (var j = e.range.columnStart; j <= e.range.columnEnd; j++) {
if (sh.getRange(i, j).getFormula() != '') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(child => {
if (!~excl.indexOf(child.getSheetName())) {
child.getRange(sh.getRange(i, j).getA1Notation()).setFormula(sh.getRange(i, j).getFormula())
}
})
}
}
}
}
全球
如果您需要重置所有公式,启用google sheets api 并尝试
function onOpen() {
SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
.addItem(' Apply all formulas from MODEL to all tabs', 'spreadFormulas')
.addToUi();
}
function spreadFormulas() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName('MODEL')
if (sh.getName() != 'MODEL') return;
var data = [];
var formulas = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getFormulas()
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas[0].length; j++) {
if (formulas[i][j] != '') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(child => {
if (!~excl.indexOf(child.getSheetName())) {
data.push({
range: `${child.getName()}!${columnToLetter(+j + 1) + (+i + 1)}`,
values: [[`${formulas[i][j]}`]],
})
}
})
}
}
}
if (data.length) {
var resource = {
valueInputOption: 'USER_ENTERED',
data: data,
};
try { Sheets.Spreadsheets.Values.batchUpdate(resource, ss.getId()); } catch (e) { console.log(JSON.stringify(e)) }
}
}
function columnToLetter(column) {
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}
我正在我称为“模型”的“父选项卡”上做角色扮演角色表,在那里我掌握了我的公式。
我创建了第二个选项卡“Character1”和第三个选项卡“Character2”。但是当我尝试使用 =QUERY 或 =TEXTFORMULA 或其他任何东西时。它不会在实际电子表格上计算公式,它只是从“模型”选项卡中获取数据。
我唯一的方法实际上是 copy/past 我所有的公式,但如果我做错了,我每次都必须在每个电子表格中更正它。
是否可以有一个公式将单元格放在:
- 模式!AE58
并在每个选项卡中自动生成相同的公式:
- CHARACTER1!AE58
- CHARACTER2!AE58
- 等...
对不起,如果它模糊,我会尽力解释。
如果你的 sheet 被称为 MODELE
试试其他的 sheet 只是:
=MODELE!AE58
对于数组,它将是:
={MODELE!AE58:AE100}
也看看“命名范围”——也许您会发现它更方便
简单
尝试
function onEdit(e) {
var sh = e.source.getActiveSheet()
var rng = e.source.getActiveRange()
if (rng.getFormula() != '' && sh.getName() == 'MODEL') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sh => {
if (!~excl.indexOf(sh.getSheetName())) {
sh.getRange(rng.getA1Notation()).setFormula(rng.getFormula())
}
})
}
}
当您在 MODEL 中更改公式时,这也会在除排除的选项卡之外的其他选项卡中更改
多个
如果您通过将公式拖动到模型中来编辑它们 sheet,请使用此模型,它允许您一次编辑所有公式
function onEdit(e) {
var sh = e.source.getActiveSheet()
if (sh.getName() != 'MODEL') return;
for (var i = e.range.rowStart; i <= e.range.rowEnd; i++) {
for (var j = e.range.columnStart; j <= e.range.columnEnd; j++) {
if (sh.getRange(i, j).getFormula() != '') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(child => {
if (!~excl.indexOf(child.getSheetName())) {
child.getRange(sh.getRange(i, j).getA1Notation()).setFormula(sh.getRange(i, j).getFormula())
}
})
}
}
}
}
全球
如果您需要重置所有公式,启用google sheets api 并尝试
function onOpen() {
SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
.addItem(' Apply all formulas from MODEL to all tabs', 'spreadFormulas')
.addToUi();
}
function spreadFormulas() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName('MODEL')
if (sh.getName() != 'MODEL') return;
var data = [];
var formulas = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).getFormulas()
for (var i = 0; i < formulas.length; i++) {
for (var j = 0; j < formulas[0].length; j++) {
if (formulas[i][j] != '') {
var excl = ['MODEL', 'OTHER'];//excluded sheets
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(child => {
if (!~excl.indexOf(child.getSheetName())) {
data.push({
range: `${child.getName()}!${columnToLetter(+j + 1) + (+i + 1)}`,
values: [[`${formulas[i][j]}`]],
})
}
})
}
}
}
if (data.length) {
var resource = {
valueInputOption: 'USER_ENTERED',
data: data,
};
try { Sheets.Spreadsheets.Values.batchUpdate(resource, ss.getId()); } catch (e) { console.log(JSON.stringify(e)) }
}
}
function columnToLetter(column) {
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}