如何找到两个范围的匹配值并编辑公共值旁边的单元格?

时间:2019-02-11 00:30:47

标签: google-apps-script google-sheets

我租用相机拍摄大学内的学生。为了跟踪我的存货和哪些学生有相机,我创建了一个google sheet.

此示例的扩展版本包括一百多个摄像头,为了使我的生活更轻松,我想在BASKET中输入要雇用的摄像头的名称,然后输入要雇用它的学生的姓名NAME单元​​格。

学生一次可以租用多个摄像机,因此,在单击“签出”按钮后又触发了“签出”功能时,我想更改从“可用”作为学生的姓名。

我是Google Apps脚本的新手,但我知道第一步是列出所需的每个变量,然后在“设备列表”中找到购物篮值,并将偏移单元替换为“名称”值。

这是我的变量:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var basket = ss.getRange("A2:A");
var name = ss.getRange("C2");
var equipmentlist = ss.getRange("E2:E11");

function checkOut() {

}

我希望所有这些都有意义。我无法在线找到有关找到两个不同范围的匹配值并更改这些值旁边的单元格的任何信息。

非常感谢!

1 个答案:

答案 0 :(得分:0)

尝试一下:

function checkOut() {
  var ss = SpreadsheetApp.getActive();
  var sh = ss.getActiveSheet();
  var name = sh.getRange("C2").getValue();
  if(name && name.length>0 && getColumnHeight(1)>1) {
    var basketrg = sh.getRange(2,1,getColumnHeight(1)-1,1);
    var basket = basketrg.getValues();
    var equipmentlist = sh.getRange(2,5,getColumnHeight(5)-1,1).getValues();
    var availabilitylist = sh.getRange(2,6,getColumnHeight(6)-1,1).getValues();
    for(var i=0;i<equipmentlist.length;i++) {
      for(var j=0;j<basket.length;j++) {
        if(equipmentlist[i][0]==basket[j][0]){
          availabilitylist[i][0]=name;
        }
      }
    }
    sh.getRange(2,6,availabilitylist.length,1).setValues(availabilitylist);
    setCameraList();
    basketrg.clearContent();
    sh.getRange('C2').clearContent()
  }else{
    SpreadsheetApp.getUi().alert('Invalid Input: No name provided or no cameras selected in checkOut() function.');
  }
}

function getColumnHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length;
}

一个简单的结帐系统

要设置此系统,您需要将以下所有脚本复制到电子表格的脚本编辑器中的Code.gs文件中。将工作表命名为“ CheckOut”。您还将需要创建一个名为“ AvailableCameras”的命名范围,该范围将为“ CheckOut!K2:K1000”,并为“ CheckOut!A2:A20”提供数据验证,或者您希望您的购物篮太大。

您可以根据需要添加任意数量的摄像机(在合理范围内……添加得越多,摄像机运行速度越慢)。当您结帐相机时,篮子中的相机选择列表会变小。返回摄像机后,您可以从可用列表中清除名称,系统将为您重新添加可用标签,这还将增加可用摄像机的数量。

这是电子表格的外观:

enter image description here

Code.gs:

function onOpen() {
  makeMenu();
}

function makeMenu(){
  SpreadsheetApp.getUi().createMenu('My Tools')
  .addItem('Check Out', 'checkOut')
  .addItem('Set Camera List', 'setCameraList')
  .addItem('Set Available List', 'setAvailableList')
  .addToUi();
}

function checkOut() {
  var ss = SpreadsheetApp.getActive();
  var sh = ss.getActiveSheet();
  var name = sh.getRange("C2").getValue();
  if(name && name.length>0) {
    var basketrg = sh.getRange(2,1,getColumnHeight(1)-1,1);
    var basket = basketrg.getValues();
    var equipmentlist = sh.getRange(2,5,getColumnHeight(5)-1,1).getValues();
    var availabilitylist = sh.getRange(2,6,getColumnHeight(6)-1,1).getValues();
    for(var i=0;i<equipmentlist.length;i++) {
      for(var j=0;j<basket.length;j++) {
        if(equipmentlist[i][0]==basket[j][0]){
          availabilitylist[i][0]=name;
        }
      }
    }
    sh.getRange(2,6,availabilitylist.length,1).setValues(availabilitylist);
    setCameraList();
    basketrg.clearContent();
    sh.getRange('C2').clearContent()
  }else{
    SpreadsheetApp.getUi().alert('Invalid Input: No name provided in checkOut() function.');
  }
}

function setCameraList() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('CheckOut');
  var LISTrg=ss.getRangeByName('AvailableCameras');
  var rg=sh.getRange(2,5,getColumnHeight(5)-1,2);
  var vA=rg.getValues();
  LISTrg.clear();
  var listA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][1]=='Available') {
      listA.push([vA[i][0]]);
    }
  }
  sh.getRange(2,11,listA.length,1).setValues(listA);
}

function onEdit(e) {
  var rg=e.range;
  var sh=rg.getSheet();
  var name=sh.getName();
  if(name!='CheckOut'){return;}
  if(rg.columnStart==1 && rg.rowStart>1) {
     setCameraList();
  }  
  if(rg.columnStart==6 && rg.rowStart>1) {
    setAvailableList();
    setCameraList();
  }
}

function setAvailableList() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('CheckOut');
  var rg=sh.getRange(2,6,getColumnHeight(5)-1,1);
  var vA=rg.getValues();
  for(var i=0;i<vA.length;i++) {
    if(!vA[i][0] && vA[i][0].length==0) {
      vA[i][0]='Available';
    }
  }
  rg.setValues(vA);
}

function getColumnHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length;
}