提问人:Mark McCune 提问时间:2/4/2023 更新时间:2/4/2023 访问量:62
如何在范围列表中设置新值,从另一个范围列表中的总和?
How can I set new values in a range list, from the sums in another range list?
问:
请提前原谅我有限的知识。
在 Google 表格中,我有一个预算列 (K),它对多个输入求和并显示最近的总数。
我正在尝试创建一个脚本,该脚本将从 K 列中复制选择值,并在执行时将这些值设置到 I 列中。
K 列和 I 在各个行中都有总计,因此简单地复制和粘贴整个列将覆盖这些函数。这将是一个可重复的操作,用于在将新值计算到此列后设置新值,因此我计划将其分配给一个按钮。
我正在使用用户 Tanaike 出色的 RangeListApp 来帮助引用我引用的多个范围。
代码的前半部分似乎正在工作:
function UpdateEFC() {
var rangeList = ['K4:K6', 'K9:K14', 'K17:K18', 'K21:K24', 'K27', 'K30:K38', 'K41:K49', 'K52:K53', 'K56:K60', 'K63:K67', 'K70:K72', 'K75:K76', 'K79:K85', 'K88:K92', 'K95:K106', 'K109:K114', 'K117:K126', 'K129:K133', 'K136:K147', 'K150:K153', 'K156:K163', 'K166:K167', 'K170:K174', 'K177', 'K180:K182', 'K185', 'K188:K190', 'K193', 'K196:K205', 'K208:K214', 'K217'];
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var r = RangeListApp.getSpreadsheet(spreadsheet).getRangeList(rangeList).getDisplayValues();
同样,列出的每个范围(即“k4:k6”)都是每个单元格中的求和函数。当我记录此脚本时,它会返回每个单元格中的计算值。以下是日志中的一个示例:
[{range='CR Template'!K4:K6, values=[[ $ 28,000.00 ], [ $ 25,000.00 ], [ $ 27,500.00 ]]},
但是,当我尝试将这些值设置到第一列时,我遇到了问题。
我尝试了以下方法:
var destinationList = ["I4:I6", "I9:I14", "I17:I18", "I21:I24", "I27", "I30:I38", "I41:I49", "I52:I53", "I56:I60", "I63:I67", "I70:I72", "I75:I76", "I79:I85", "I88:I92", "I95:I106", "I109:I114", "I117:I126", "I129:I133", "I136:I147", "I150:I153", "I156:I163", "I166:I167", "I170:I174", "I177", "I180:I182", "I185", "I188:I190", "I193", "I196:I205", "I208:I214", "I217"];
var values = rangeList;
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
RangeListApp.getSpreadsheet(spreadsheet).getRangeList(destinationList).setValues(values);
此脚本将单元格区域返回到脚本中编写的列中。即 I4 = K4:K6、I5 = K4:K6、I6 = K4:K6,但不返回显示的数值求和值。
我还尝试过一个版本
var values = r;
我的想法是获取显示值的输出并将这些值设置到新的范围列表中,但是这只返回:
[object Object]
进入每个单元格。
我知道我在如何定义或回忆这些值方面有问题,所以这里的任何指导将不胜感激。
提前非常感谢。
答:
0赞
Tanaike
2/4/2023
#1
我相信你的目标如下。
- 您希望将值从 复制到 。
['K4:K6', 'K9:K14', 'K17:K18',,,]
["I4:I6", "I9:I14", "I17:I18",,,]
问题和解决方法:
不幸的是,在当前阶段,我的 RangeListApp 无法复制带有范围的值。因此,在这种情况下,作为当前的解决方法,我建议使用带有 Sheets API 的脚本。示例脚本如下。
示例脚本:
在使用此脚本之前,请在 Google 高级服务中启用 Sheets API。
function myFunction() {
var sheetName = "Sheet1"; // Please set your sheet name.
// These ranges are from your script.
var srcRangeList = ['K4:K6', 'K9:K14', 'K17:K18', 'K21:K24', 'K27', 'K30:K38', 'K41:K49', 'K52:K53', 'K56:K60', 'K63:K67', 'K70:K72', 'K75:K76', 'K79:K85', 'K88:K92', 'K95:K106', 'K109:K114', 'K117:K126', 'K129:K133', 'K136:K147', 'K150:K153', 'K156:K163', 'K166:K167', 'K170:K174', 'K177', 'K180:K182', 'K185', 'K188:K190', 'K193', 'K196:K205', 'K208:K214', 'K217'];
var dstRangeList = ["I4:I6", "I9:I14", "I17:I18", "I21:I24", "I27", "I30:I38", "I41:I49", "I52:I53", "I56:I60", "I63:I67", "I70:I72", "I75:I76", "I79:I85", "I88:I92", "I95:I106", "I109:I114", "I117:I126", "I129:I133", "I136:I147", "I150:I153", "I156:I163", "I166:I167", "I170:I174", "I177", "I180:I182", "I185", "I188:I190", "I193", "I196:I205", "I208:I214", "I217"];
var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
var values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: srcRangeList.map(e => `'${sheetName}'!${e}`), valueRenderOption: "FORMATTED_VALUE" }).valueRanges;
var data = values.map(({ values }, i) => ({ range: `'${sheetName}'!${dstRangeList[i]}`, values }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ssId);
}
- 运行此脚本时,将 的值复制到 。
srcRangeList
dstRangeList
注意:
- 我想考虑更新 RangeListApp。
引用:
评论
0赞
Tanaike
2/7/2023
@Mark McCune 关于,欢迎。谢谢你让我知道。我很高兴您的问题得到了解决。如果您的问题已解决,请按下接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案对他们有用。如果您没有找到该按钮,请随时告诉我。stackoverflow.com/help/accepted-answerThis worked! thank you.
0赞
Mark McCune
2/7/2023
我添加了以下内容,以允许 shedName 根据哪个处于活动状态是动态的 var sheetName = (function getSheetName() { let activeSheet = SpreadsheetApp.getActiveSheet(); return activeSheet.getName();})();
0赞
Tanaike
2/7/2023
@Mark McCune 感谢您的回复。我明白了。
评论