如何用 Apps Script 将内容复制到单元格中的动态地址?
数据阿明
结论
先从 Summary!G5 读取公式计算出的地址,再通过 Summary.getRange(address) 获取目标范围。代码中把 spreadsheet 当作工作表来调用 getRange(),但 Spreadsheet 对象没有这个方法,应由工作表对象调用 getRange()。
以下示例假设 Geminix 是命名范围,且 Summary!G5 返回 B4。如果实际使用的是标题中的 F8 和 C6,请相应替换代码里的 G5 和 B4。
示例代码
function copyValuesToDynamicAddress() {
const spreadsheet = SpreadsheetApp.getActive();
const summary = spreadsheet.getSheetByName('Summary');
if (!summary) {
throw new Error('找不到名为 Summary 的工作表');
}
// G5 中的公式返回类似 B4 的 A1 地址
const address = summary.getRange('G5').getDisplayValue().trim();
if (!address) {
throw new Error('Summary!G5 没有返回目标地址');
}
// 假设 Geminix 是已定义的命名范围
const source = spreadsheet.getRangeByName('Geminix');
if (!source) {
throw new Error('找不到名为 Geminix 的命名范围');
}
const destination = summary.getRange(address);
source.copyTo(
destination,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
);
}
getDisplayValue() 读取的是单元格显示的结果,而不是公式文本。例如,若 G5 中的公式计算结果为 B4,那么 address 的值就是 B4,目标范围为 Summary!B4。这里的 copyTo() 会将命名范围 Geminix 的内容以纯值形式复制到目标范围。
如果 Geminix 是工作表名称
如果 Geminix 指的是工作表而不是命名范围,需要明确指定该工作表上的源范围。下面的示例将 Geminix!A1:C10 复制到动态目标位置:
const sourceSheet = spreadsheet.getSheetByName('Geminix');
if (!sourceSheet) {
throw new Error('找不到名为 Geminix 的工作表');
}
const source = sourceSheet.getRange('A1:C10');
const destination = summary.getRange(address);
source.copyTo(
destination,
SpreadsheetApp.CopyPasteType.PASTE_VALUES,
false
);
请将 A1:C10 替换为实际要复制的范围。源范围和目标位置的尺寸应符合要复制的数据。
注意事项
Summary!G5返回的B4会被解释为Summary工作表中的地址。如果目标单元格在另一张工作表,请先用getSheetByName()获取该工作表,再调用它的getRange(address)。- 如果
Geminix是命名范围,使用spreadsheet.getRangeByName('Geminix');如果它是工作表名称,则先获取该工作表,再指定源范围。 getActiveRange()返回当前选中的范围。使用辅助单元格确定目标位置时,直接用读取到的地址创建目标范围即可,无需先激活该单元格。
备注:内容仅供参考。
