要匹配单元格值的Google脚本,请在不同标签

时间:2018-02-21 10:59:36

标签: google-apps-script google-sheets

点击此处查看Sample Sheet

我需要一个将单元格值(Sheet1!Q5)与另一个标签/表格(NegotiationData!A1:O1)中的范围匹配的解决方案,并将从第一个工作表中获取的相关数据粘贴到第二个工作表的指定列下在匹配值下。

例如,如果Sheet1!Q5与 NegotiationData中的名称匹配! A1 然后执行以下操作

  1. 获取Sheet1! R6并粘贴在NegotiationData中!A3:A
  2. 获取Sheet1! Q6并粘贴在NegotiationData!B3:B
  3. 获取Sheet1! Q7并粘贴在NegotiationData!C3:C
  4. 此外,每次脚本运行时,它都不应覆盖数据,而应查找下一个空行并粘贴值。

    我有一个不完整的脚本,我试图通过各种帖子的研究来实现上述目标,但因为我只有一周的时间来编码,所以我不能再进行任何进一步的工作了。下面的脚本。 我没有找到如何匹配该值并获取相关数据并将其粘贴到匹配值下方。

    请帮忙!

    不完整/不正确的脚本(文件名:NegotiationSubmit)

        function submitNegotiation() {
      var sh, id, v, estNum, negotiation, negoNotes, i;
      sh = SpreadsheetApp.getActive();
      id = sh.getSheetByName('Sheet1').getRange('Q5').getValue();
      v = sh.getRange('R6').getValue();
      estNum = Number(sh.getRange('Q6').getValue().split(" ")[1]);
      negoNotes = sh.getRange('Q7').getValue();
      negotiation =sh.getSheetByName('NegotiationData').getRange('A1:O');
    
      if(v && estNum) {
        negotiation.setValues(negotiation.getValues()
              .map(function (r, i) {
              if (r[0] == id) {
              r[1] = v;
              r[2] = estNum;
              r[3] = negoNotes;
              }
              return r;
              })
              )
      }
    }
    

2 个答案:

答案 0 :(得分:2)

这次修改怎么样?

修改要点:

  • 立即检索“Q5:R7”的值,并将值转换为导入值。
    • 使用解构分配来检索每个值。
  • 使用ids[0][i] == id检索到的列数导入转换后的值。

修改后的脚本:

function submitNegotiation() {
  var id, estNum, v, negoNotes;
  var sh = SpreadsheetApp.getActive();
  var values = sh.getSheetByName('Sheet1').getRange("Q5:R7").getValues();
  [id] = values[0];
  [estNum, v] = values[1];
  [negoNotes] = values[2];
//  estNum = Number(estNum.split(" ")[1]); // If you want to use "estNum = Number(sh.getRange('Q6').getValue().split(" ")[1]);", please use this line.
  var sh2 = sh.getSheetByName('NegotiationData');
  var ids = sh2.getRange("A1:O1").getValues();
  for (var i=0; i<ids[0].length; i++) {
    if (ids[0][i] == id) {
      sh2.getRange(sh2.getLastRow() + 1, i + 1, 1, 3).setValues([[v, estNum, negoNotes]]);
    }
  }
}

注意:

我对以下几点感到困惑。

  • 在您的脚本中,estNumNumber(sh.getRange('Q6').getValue().split(" ")[1]);。但是在您的示例电子表格中,使用了单元格“Q6”的Estimate 1
    • 我在修改后的脚本中对此进行了评论。
  • 在您的示例电子表格中,“故事ID”为1。但是在你的脚本中,它是单元格“R6”的US-001
    • 在此修改后的脚本中,使用了单元格“R6”的US-001

如果我误解了你的问题,我很抱歉。

编辑:

function submitNegotiation() {
  var id, estNum, v, negoNotes;
  var sh = SpreadsheetApp.getActive();
  var values = sh.getSheetByName('Sheet1').getRange("Q5:R7").getValues();
  [id] = values[0];
  [estNum, v] = values[1];
  [negoNotes] = values[2];
  estNum = Number(estNum.split(" ")[1]); // If you want to use "estNum = Number(sh.getRange('Q6').getValue().split(" ")[1]);", please use this line.
  var sh2 = sh.getSheetByName('NegotiationData');
  var ids = sh2.getRange("A1:O1").getValues();
  for (var i=0; i<ids[0].length; i++) {
    if (ids[0][i] == id) {
      var temp = sh2.getRange(1, i + 1, sh2.getLastRow(), 3).getValues();
      for (var j=temp.length-1; j>=0; j--) {
        if (temp[j].join("") != "") {
          sh2.getRange(j + 2, i + 1, 1, 3).setValues([[v, estNum, negoNotes]]);
          break;
        }
      }
    }
  }
}

答案 1 :(得分:0)

我意识到这与你的代码不太相似。对于那个很抱歉。我也在学习。但无论如何我还是要提供一种替代方法,包括找到相应列的最后一行......

Weight  Size    Color_blue  Color_yellow
2       9       1           0