在应用程序脚本中,确认 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的主要内容,如果未能解决你的问题,请参考以下文章

VBA 代码填充 7 个相邻单元格中的索引匹配函数

如果相邻单元格不为空 + 匹配,则从上面的单元格自动填充

使用 openpyxl 移动到相邻单元格

Excel - 如何比较 2 列中的单元格,然后如果 B 列匹配,则使用 B 列中匹配单元格旁边的 C 列中的值?

在相邻单元格中找到的日期之后的十个工作日(不包括节假日)突出显示相邻单元格

将一个单元格中的字符串放入我的索引匹配 VBa 脚本的中间