【发布时间】:2021-12-01 09:46:16
【问题描述】:
我觉得我的这个脚本几乎按预期工作,但我不确定在 for 循环中将过程的某些组件放置在何处以达到预期的结果。隧道视觉现在非常有效,我完全有可能过度思考一个简单的任务。如果我能更清楚地描述这个问题,请告诉我。对现有资源的任何建议或指示都会有所帮助。
设置:第一页包含从单元格 I3 开始向下的文本值的动态垂直列表。工作表 2 包含从 A2 范围开始向下的文本值的动态垂直列表,并且在 B 列的相同行中有一组类似的文本值。
目标:
- 获取 Sheet1 第 I 列(范围一)中每个已使用单元格的值
- 获取 Sheet2 A 列中每个已使用单元格的值(范围二)
- 对于范围一中的每个使用的单元格,检查每个范围一的值 单元格以查看该值是否存在于范围二中
- 如果存在匹配,则获取区域 2 中的单元格的行号 包含值(如果匹配,则只会有一个匹配 存在)
- 获取Sheet2 B列同一行单元格的值
- 将上述值设置为包含该值的行中的单元格值 在 Sheet1 Column M 的两个范围内找到
以下是我能想到的。我能够让它运行到最后一步。似乎匹配的 rowNumber 变量没有随着每个 for 循环而更新。
// Get values of range one
var lastRowRangeOne = sheetone.getRange('I3').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
var rangeOneValues = sheetone.getRange('I3:I' + lastRowClientColumn).getValues();
// Get values of range two
var sheettwo = spreadsheet.getSheetByName('Sheet2');
var sheettwoLastRow = sheettwo.getLastRow();
var sheettwoList = sheettwo.getRange('A2:A' + sheettwoLastRow).getValues();
var sheettwoListFlat = sheettwoList.map(function(row) {return row[0];});
for (var i = 0; i< rangeOneValues.length ; i++){ // for each row in range one
if (sheettwoListFlat[i] == rangeOneValues[i]) { // if the range one value exists in range two
var rowNumber = sheettwoListFlat.indexOf(rangeOneValues[i]) + 3; // get the row number of the matching value found in range two
var sheetOneColumnMValue = sheettwo.getRange('B' + rowNumber).getValue(); // get the cell value of the same row in sheet two column B
var sheetOneRowNumber = i + 3; // get the row number of the range one value
sheetone.getRange('M' + sheetOneRowNumber).setValue(sheetOneColumnMValue); // set the cell value of sheet one column M row x, where x is sheetOneRowNumber
}
}
【问题讨论】:
-
请提供一个示例电子表格和所需的输出
-
谢谢!想要的结果肯定比看起来简单。请在此处查看示例工作簿:docs.google.com/spreadsheets/d/… 我使用上述脚本的目标是,对于 I 列中的每个值,检查该值是否存在于表二的 A 列中。如果存在,则检索第二张表 B 列中等效行的值,并将该值插入与第一张表 M 列中的原始值匹配的行中。
标签: google-apps-script google-sheets