首页 > 解决方案 > 如何为 setValue 返回多个列值

问题描述

我试图运行一些脚本来查找各种单元格值,返回包含搜索值的单元格的每个列号,然后setValue根据每个返回值。我已经到了下面的例子:

function superAuto() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var scorecard = SpreadsheetApp.openById('SCORESHEET');
var scorecardData = scorecard.getDataRange().getValues();

var column = columnfinder ();

scorecard.getRange(18, [column]).setValue("Example input");
}


function columnfinder() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

    for(var j=0, jLen=reportData.length; j<jLen; j++) {
      for(var k=0, kLen=reportData[0].length; k<kLen; k++) {
        var find = "Nov-20" || "Dec-20" || "Jan-21";
        if(find == reportData[j][k]) {
          Logger.log(k);
          return (k);}
      }
    }
  }

我的代码的问题在于它只返回k一个搜索词(第一个,"Nov-20"),因此只有setValue一个SCORESHEET基于此的单元格,而在这个例子中,我真的很喜欢 3 个单元格找到REPORTSHEET(所有搜索词都可以找到),k要返回 3 个值,因此要填充 3 个单元格SCORESHEET

有什么想法吗?

标签: google-apps-scriptgoogle-sheets

解决方案


如果要columnfinder()返回列索引列表,则需要定义一个数组变量,该变量将在返回其值之前保存匹配的列索引。您可以使用array.push()将值附加到您的数组。

你的代码:

function superAuto() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();

  var scorecard = SpreadsheetApp.openById('SCORESHEET');
  var scorecardSheet = scorecard.getSheetByName('Sheet1');
  var scorecardData = scorecard.getDataRange().getValues();

  var columns = columnfinder();
  Logger.log(columns);

  columns.forEach(col=>{
    scorecardSheet.getRange(18, col).setValue("Example input");
  })

}


function columnfinder() {
  var report = SpreadsheetApp.openById('REPORTSHEET');
  var reportData = report.getDataRange().getValues();
  var result = [];

  for(var j=0, jLen=reportData.length; j<jLen; j++) {
    for(var k=0, kLen=reportData[0].length; k<kLen; k++) {
      var find = ["Nov-20", "Dec-20", "Jan-21"];

      if(find.includes(reportData[j][k])) {
        //return (k);

        //Array is in zero-based, but column index for sheet range is in one-based.
        result.push(k+1);
      }
    }
  }

  return result;
}

修改完成:

  1. 我声明了一个result数组columnfinder(),它将保存列索引并使用 in 推送找到的索引result.push(k+1);

  2. 替换了匹配字符串中的条件columnfinder(),我声明了一个数组find并使用了 array.includes()并检查find数组是否包含正在检查的当前单元格。

  3. result完成循环后返回columnfinder()

  4. 中添加了一个scorecardSheet变量superAuto()。最初您试图getRange(row, column)在电子表格中使用scorecard这是不可能的。(请参阅电子表格方法)。getRange(row, column)在工作表类中可用


输出:

报告表:

在此处输入图像描述

评分表:

在此处输入图像描述


推荐阅读