在应用程序脚本中,确认 2 个相邻单元格匹配,然后使用目录选项卡将数据推送到指定的工作表 ID
Posted
技术标签:
【中文标题】在应用程序脚本中,确认 2 个相邻单元格匹配,然后使用目录选项卡将数据推送到指定的工作表 ID【英文标题】:In app scripts, confirm that 2 adjacent cells match, then use a directory tab to push data to a specified sheet ID 【发布时间】:2021-11-21 20:43:18 【问题描述】:小心,我可能想多了。
当我试图弄清楚在这种情况下该怎么做时,我不断陷入循环思维循环,因此我将尝试解释我的想法以及我所处的位置。
-
表格是在 Google 表格上填写的
表单回复已添加到“表单回复选项卡”中的主表单表中
-
激活代码,检查表单是否填写正确(A 列和 B 列匹配)
-
如果它们匹配,它会通过查看目录选项卡找到该行需要转到的相应 google 电子表格 ID。
-
然后将该项目发送到相应的列表中,该列表位于它自己的工作表中
-
这将持续到 Main QA Forms Responses 选项卡的其余行,直到检查完所有行并且没有更多条目。
我已经连续几个小时试图理解这一点,但可能是从错误的角度来处理这一切。 截至目前,这是我在代码中的进展:
function onEdit()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = s.getActiveRange();
var columnSearchNum = 3;
var columnDatastarts = "C";
var formSheetName = "QA Form Responses";
var directorySheetName = "Program Directory";
var matchingProgramSheetIDColumn = 1;
if(s.getName() == formSheetName && r.getColumn(0) == r.getColumn(1))
var sourceRow = r.getRow();
var matchingProgram = sourceRow.getRange(0,0).getValue();
var matchingProgramSheetID = s.getName(Programdirectory)....//[code needed1]
//^^^^ I need a line here to pull matching the data inSheetID column where Matching program's string is
//from this code line, Go to that 'program's sheet'
var programSheet = ss.getSheetByID(matchingProgramSheetID);
var programSheetNumRows = programSheet.getLastRow();
//console.log(programSheetNumRows);
var formSheetNumColumns = s.getLastColumn();
var targetRange = programSheet.getActiveRange()
var targetValue = +s.getRange(columnDatastarts+sourceRow).getValue()
//console.log(targetValue);
var programSheetRange = programSheet.getRange(1,columnSearchNum,programSheetNumRows,1);
//console.log(programSheetRange.getNumRows() +" " +programSheetRange.getNumColumns() + " " + programSheetRange.getValues());
var targetRow = findIndex(programSheetRange.getValues(), targetValue);
//console.log(targetRow);
var target = programSheet.getRange(targetRow, 1);
s.getRange(sourceRow, 2, 1, formSheetNumColumns).moveTo(target);
;
function findIndex(array, search)
//console.log(array);
if(search == "") return false;
for (var i=0; i<array.length; i++)
//console.log("comparing " + +array[i] + " to "+ +search);
if (+array[i] == +search)
return i+1;
return -1;
【问题讨论】:
我能问一下您当前问题的详细信息吗?而且,为了正确理解您的情况并测试脚本,您能否提供示例电子表格? 您说表格是在 Google 表格上填写的。这是故意的吗?您的意思是否可能是“表单已在 Google 表单上填写”?两者之间差异的影响将非常深远。 google 表单,然后一旦将答案放入链接到表单的工作表中,此代码就会触发 你测试过你正在使用的代码吗?这对你有什么作用?有什么错误吗?我建议你试着把重点放在这个问题上。 【参考方案1】:您希望在表单响应表上的值与另一表上给定列中的值匹配,然后返回与匹配单元格相邻的单元格中的值。
可能有很多方法可以做到这一点,但如果使用脚本,javascript 方法indexOf
是一个明显的选择。以下内容未经测试,但逻辑合理。
插入 [需要代码1]
// define the Program sheet
var progsheet = ss.getSheetByName(directorySheetName)
// define the first row of data on the program sheet
var firstRowofData = 3
// get the data for columns one and two of the program sheet.
// starting row=3, starting column=1, number of rows = lastrowminus first row plus 1, number of columns = 2
var progsheetdata = progsheet.getRange(firstRowofData,1,progsheet.getLastRow()-firstRowofData+1,2).getValues()
// get Program manager Column
var ProgManager = progsheetdata.map(function(e)return e[0];)
// search the Program manager Column for the first instance of the matching program value
// indexOf returns index if found, or -1 if not found
var result =ProgManager.indexOf(matchingProgram);
if (result == -1)
// couldn't find a matching program
// do something to quit/error message
return
else
// the id will be in the row returned by IndexOf and in the adjacent column to the right.
var id = progsheetdata[result][1]
【讨论】:
以上是关于在应用程序脚本中,确认 2 个相邻单元格匹配,然后使用目录选项卡将数据推送到指定的工作表 ID的主要内容,如果未能解决你的问题,请参考以下文章
Excel - 如何比较 2 列中的单元格,然后如果 B 列匹配,则使用 B 列中匹配单元格旁边的 C 列中的值?