如何从单个列中的多个单元格中获取 .getValues 和 .setValues?
How do I .getValues and .setValues from multiple cells in a single column?
我有一个代码,根据在 F 列中勾选的属性数量,从“输入一揽子费用”中提取 D 列中某些单元格的值,其中 属性 地址出现在 G 列中,如果F 已检查。我在选中的属性之间平均分摊费用,响应出现在“一揽子响应”上。如果我检查四个属性和 运行 脚本,我会在“一揽子响应”上得到四个正确数量的响应,但第一个 属性 名称被列出四次而不是每个 属性 名称已检查。就我非常有限的知识而言,我已经采取了这一点,但我不确定如何让每个人 属性 都列在“一揽子回应”中。我觉得它涉及使用 values.foreach 但我无法使其正常工作。请帮忙! :) 这是代码:
function submitDataB() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Enter Blanket Expenses"); //Form Sheet
var datasheet = ss.getSheetByName("Blanket Responses"); //Data Sheet
var dataRange = ss.getRange("B4:H28")
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox = row[5];
var values = [[formSS.getRange("G4:G28").getValues(),
formSS.getRange("C4").getValue(),
formSS.getRange("D5").getValue(),
formSS.getRange("D6").getValue(),
formSS.getRange("D7").getValue(),
formSS.getRange("D8").getValue(),
formSS.getRange("D9").getValue(),
formSS.getRange("D10").getValue(),
formSS.getRange("D11").getValue(),
formSS.getRange("D12").getValue(),
formSS.getRange("D13").getValue(),
formSS.getRange("D14").getValue(),
formSS.getRange("D15").getValue()]];
if (checkbox == 0)
{
continue;
}
datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 13).setValues(values);
}}
这是当前代码的结果
这就是我想要的结果
解决方案
你要修改这行代码:
//...
var values = [[
formSS.getRange("G4:G28").getValues(),
//...
您将每个 属性 名称放入将成为单个单元格值的内容中。这不是合法的操作,作为副作用,只有该范围的第一个值被插入到使用此操作的相应范围中:
datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 13).setValues(values);
第一个值是 G4
单元格的内容,即“10 Gordon Ridge”。
建议修改
您应该循环遍历 G 列值,并仅在选中复选框时插入相应的值。
为了实现这一点,您可以在提取 G 列值时简单地将行索引设置为变量:
//...
var values = [[
formSS.getRange(`G${i + 1}`).getValue(),
//...
注意:请记住,在 Javascript 数组中,第一个索引是 0,而在 Google Spreadsheet A1 Notation 中是 1。这意味着您必须将循环索引递增 1 以获得A1 Notation中相应的行索引。
参考
我有一个代码,根据在 F 列中勾选的属性数量,从“输入一揽子费用”中提取 D 列中某些单元格的值,其中 属性 地址出现在 G 列中,如果F 已检查。我在选中的属性之间平均分摊费用,响应出现在“一揽子响应”上。如果我检查四个属性和 运行 脚本,我会在“一揽子响应”上得到四个正确数量的响应,但第一个 属性 名称被列出四次而不是每个 属性 名称已检查。就我非常有限的知识而言,我已经采取了这一点,但我不确定如何让每个人 属性 都列在“一揽子回应”中。我觉得它涉及使用 values.foreach 但我无法使其正常工作。请帮忙! :) 这是代码:
function submitDataB() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Enter Blanket Expenses"); //Form Sheet
var datasheet = ss.getSheetByName("Blanket Responses"); //Data Sheet
var dataRange = ss.getRange("B4:H28")
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox = row[5];
var values = [[formSS.getRange("G4:G28").getValues(),
formSS.getRange("C4").getValue(),
formSS.getRange("D5").getValue(),
formSS.getRange("D6").getValue(),
formSS.getRange("D7").getValue(),
formSS.getRange("D8").getValue(),
formSS.getRange("D9").getValue(),
formSS.getRange("D10").getValue(),
formSS.getRange("D11").getValue(),
formSS.getRange("D12").getValue(),
formSS.getRange("D13").getValue(),
formSS.getRange("D14").getValue(),
formSS.getRange("D15").getValue()]];
if (checkbox == 0)
{
continue;
}
datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 13).setValues(values);
}}
这是当前代码的结果
这就是我想要的结果
解决方案
你要修改这行代码:
//...
var values = [[
formSS.getRange("G4:G28").getValues(),
//...
您将每个 属性 名称放入将成为单个单元格值的内容中。这不是合法的操作,作为副作用,只有该范围的第一个值被插入到使用此操作的相应范围中:
datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 13).setValues(values);
第一个值是 G4
单元格的内容,即“10 Gordon Ridge”。
建议修改
您应该循环遍历 G 列值,并仅在选中复选框时插入相应的值。
为了实现这一点,您可以在提取 G 列值时简单地将行索引设置为变量:
//...
var values = [[
formSS.getRange(`G${i + 1}`).getValue(),
//...
注意:请记住,在 Javascript 数组中,第一个索引是 0,而在 Google Spreadsheet A1 Notation 中是 1。这意味着您必须将循环索引递增 1 以获得A1 Notation中相应的行索引。