【问题标题】:Output of GAS function not the individual cell value, but the full column of valuesGAS 函数的输出不是单个单元格值,而是整列值
【发布时间】:2019-04-26 23:40:43
【问题描述】:

我是 Google Apps 脚本的新手。我创建了一个 Google Apps 脚本作为 vlookup 的替代品(出于某种原因,我想要静态数据)。

我创建了一个函数,它能够在工作表 1“主工作表”(用户输入)和工作表 2“查询工作表”(包含数据结果)之间进行通信。

目的是比较 mainSheet ColW 和 querySheet ColA

如果 mainSheet ColW 匹配,则将 mainSheet ColX 中的值替换为相应行中 querySheet ColB 的值。

例如,如果 mainSheet Col W2 为“123”且 querySheet Col A5 为“123”,则将 querySheet Col B5 中的值粘贴到 mainSheet Col X2 中

这是为了将用户提供的输入与 X 时间段后在后端更新的数据进行比较。为了减少不断查看这些数据的需要,查询会间隔运行。用结果填充用户表。

function match(){

  //Sheet with the query outputs
  var querySheet = SpreadsheetApp.openById("SHEETID123456789"); // query results are dumped in this doc

  var querySheetTab = querySheet.getRange("query!A1:F"); //tab with the results

  //Main sheet to have query data pasted
  var mainSheet = SpreadsheetApp.getActiveSpreadsheet(); //current worksheet

  var mainSheetTab = mainSheet.getRange("USERSHEET!W2:X"); //Tab and range of the data. W contains a number. X is where the results of B from the querySheet go

  //values to compare
  var mainSheetVal = mainSheet.getSheetByName('USERSHEET').getRange('W2:W').getValues(); //values to match against query results

  var mainSheetComp = mainSheet.getSheetByName('USERSHEET').getRange('W2:W'); //numbers to match against query results

  var mainSheetSet = mainSheet.getSheetByName('USERSHEET').getRange('X2:X'); //Where values get pasted. 

  var getValQS = querySheet.getSheetByName('query').getRange('A1:B').getValues(); //query results includes both objects values

  var valQS = querySheet.getSheetByName('query').getRange('A1:A'); // query results

  var valSet = querySheet.getSheetByName('query').getRange('B2:B'); //desired values to paste.

  var output = [];

  for (var i = 0; i < mainSheetVal.length; i++) {
    mainSheetSet.setValue(getValQS[i][0]);
    SpreadsheetApp.flush();
    Utilities.sleep(10000);
    if (mainSheetComp.getValue() == '') {
      output.push([getValQS[i][0]]);
    }
  }
  mainSheet.getRange(2, 12, output.length, 2).setValues(output);
}

此工作表最终将 X2:X 替换为 A1 的值,然后是 A2,并且即使使用空单元格也会继续循环。我无法设置正确的比较。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:
    • 您希望将USERSHEET 工作表的“W”列的值与query 工作表的“A”列的值进行比较。
    • 当以上两个值相同时,您要将query工作表的“B”列的值放到USERSHEET工作表的“X”列的单元格中。

    如果我的理解是正确的,那么这个修改呢?请认为这只是几个答案之一。

    修改点:

    • USERSHEET 的值是通过一次调用从“W:X”中检索到的。
    • query的“A”列的值与USERSHEET的“W”列的值相同时修改了USERSHEET的值。
      • 修改USERSHEET的值后,将修改后的值放到USERSHEET中。

    修改脚本:

    function match(){
      var querySheet = SpreadsheetApp.openById("SHEETID123456789").getSheetByName("query");
      var queryValues = querySheet.getRange(1, 1, querySheet.getLastRow(), 2).getValues(); // A:B
      var mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("USERSHEET");
      var mainRange = mainSheet.getRange(2, 23, mainSheet.getLastRow() - 1, 2); // W:X
      var mainValues = mainRange.getValues();
      for (var i = 0; i < mainValues.length; i++) {
        for (var j = 0; j < queryValues.length; j++) {
          if (mainValues[i][0] == queryValues[j][0]) {
            mainValues[i][1] = queryValues[j][1];
          }
        }
      }
      mainRange.setValues(mainValues);
    }
    

    注意:

    • 在此修改中,USERSHEET 的“W”和“X”列被覆盖。如果你想改变这种情况,请告诉我。

    如果我误解了您的问题,我深表歉意。

    【讨论】:

    • 这正是我想要的。谢谢!
    • @JustSomeScrub 感谢您的回复。很高兴您的问题得到解决。
    【解决方案2】:

    试试这个:

    这会将主工作表的 W 列与查询工作表的 A 列进行比较,并将查询工作表的 B 列中的值放入主工作表的 X 列中,与 A 列中的匹配在同一行中。通过将 setValue 移出循环,但我不想乱写其他数据。此外,我没有对此进行了测试,因此总是有可能需要更正。

    function match() {
      var qss=SpreadsheetApp.openById('id');
      var qsh=qss.getSheetByName('query');
      var qrgA=qsh.getRange(2,1,qsh.getLastRow(),1);//colA
      var qrgB=qsh.getRange(2,2,qsh.getLastRow(),1);//colB
      var qvB=qrgB.getValues();
      var qvA=qrgA.getValues();
      var qvAf=qvA.map(function(r){return r[0]});//flatten array
      var mss=SpreadsheetApp.getActive();
      var msh=mss.getSheetByName('USERSHEET');
      var mrg=msh.getRange(2,23,msh.getLastRow(),1);//colW
      var mVa=mrg.getValues();
      for(var i=0;i<mVa.length;i++) {
        var index=qvAf.indexOf(mvA[i][0]);
        if(index>-1) {
          msh.getRange(i + 2,24).setValue(qvB[index][0]);//put matches in same row of columnX
        }
      }
    }
    

    【讨论】:

    • 谢谢,我也试试这个。
    猜你喜欢
    • 2019-01-23
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多