Google脚本:匹配范围和更新相应的值

时间:2018-04-12 13:46:26

标签: google-apps-script google-sheets

Sheet1:DashBoard |范围:A7:B17

(B7:有一个过滤功能,显示BackEnd Sheet中所有打开任务的结果)

Sheet2:BackEnd |范围:J56:M

匹配 B7:B17与M56:M

如果有匹配则

粘贴值从A7:A17到J56:J

Click here for Sample Sheet

以下脚本执行上述操作,但仅在运行它的第一个实例上执行。试图重复这个过程并没有做任何事情。代码没有错误。

我是任何形式编码的初学者,下面的代码是通过参考论坛上的各种解决方案编写的。我可能在这里缺少一些逻辑而不能解码它以获得所需的最终结果。

提前致谢

function updateToDo2() {
  var sh, toDo, status, update, i;
  sh = SpreadsheetApp.getActive().getSheetByName('DashBoard')
  toDo = sh.getRange('B7:B17').getValues();
  status = sh.getRange('A7:A17').getValues();

  update = SpreadsheetApp.getActive().getSheetByName('BackEnd').getRange('J56:M');

  update.setValues(update.getValues()
    .map(function(r, i) {
        if (r[3] == toDo[i]) {
            r[0] = status[i];
        }
        return r;
    })
  )
}

编辑:工作代码但速度很慢。 需要优化。 请帮忙!

function rowOfStatus(status) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BackEnd');
  var data = sheet.getRange('M56:M60').getValues();

  for (var i = 0; i < data.length; i++) {
    if (data[i][0] == status) { //[1] because column B
      return i + 1;
    }
  }
}

function updateToDo() {
  var sh, sh1, dashboard, results, noteText, status, i, counter;
  sh = SpreadsheetApp.getActive().getSheetByName('DashBoard');
  sh1 = SpreadsheetApp.getActive().getSheetByName('BackEnd');
  dashboard = sh.getRange('A7:B11');
  results = dashboard.getDisplayValues();
  results.forEach(function(row) {
    status = row[0];
    noteText = row[1];
    counter = Number(rowOfStatus(noteText));
    if (counter > 0 && status != '') {
      counter = 55 + Number(rowOfStatus(noteText));
      sh1.getRange('J' + counter).setValue(status);
    }
  });
}

2 个答案:

答案 0 :(得分:0)

我并不完全明白你在做什么,但我认为我会采取刺痛并试图帮助你。所以这可能不是你想要的。在那种情况下抱歉打扰你。

function updateToDo2() {
  var sh=SpreadsheetApp.getActive().getSheetByName('DashBoard')
  var toDo=sh.getRange('B7:B17').getValues();
  var status=sh.getRange('A7:A17').getValues();
  var update=SpreadsheetApp.getActive().getSheetByName('BackEnd').getRange('J56:M'+SpreadsheetApp.getActive().getSheetByName('BackEnd').getLastRow());
  var vA=update.getValues();
  for(var i=0;i<vA.length;i++){
    if(vA[i][3]==toDo[i]){
      vA[i][0]=status[i];
    }
  }
  update.setValues(vA);
}

答案 1 :(得分:0)

我从Google文档帮助论坛获得优化此代码的帮助,由Jean-Pierre提供。自从我第一次在该论坛上发布了我的查询,并被建议在其社区成员的StackOverflow上发布我的查询。因此,这里是解决方案,以防它在这里帮助某人。这是短暂的&amp;很快!

Google Forum Link

<强>代码:

function updateToDo() {
var ss, arr, values, colB, backendValues, backendColM;
ss = SpreadsheetApp.getActive();
arr = [];
values = ss.getSheetByName('DashBoard').getRange('A7:B17').getValues()
colB = values.map(function (v) {
    return v[1];
})
backendValues = ss.getSheetByName('BackEnd').getRange('J56:M').getValues()
backendColM= backendValues.map(function (bv) {return bv[3]}).forEach(function (el, i) {
    arr[i] = (el && colB.indexOf(el) > -1) ? ['Closed', 'Cancelled'].indexOf(values[colB.indexOf(el)][0]) > -1 ? [values[colB.indexOf(el)][0]] : [backendValues[i][0]]
    : [backendValues[i][0]];
})
ss.getSheetByName('BackEnd').getRange(56, 10, arr.length, 1).setValues(arr)
ss.getSheetByName('DashBoard').getRange('A7:A17').setValue(null);
}