Как найти совпадающие значения двух диапазонов и отредактировать ячейку рядом с общими значениями? - PullRequest
0 голосов
/ 11 февраля 2019

Я нанимаю камеры для съемок студентов в университете.Чтобы отслеживать, что у меня есть в наличии и у каких учеников есть камера, я создал лист Google.

Расширенная версия этого примера включает в себя более ста камер, поэтому длямоя жизнь стала проще, я хотел бы ввести в КОРЗИНУ название нанимаемых камер, а затем ввести имя студента, нанимающего его, в ячейку ИМЯ.

Студенты могут нанять более одной камерыи, таким образом, после нажатия кнопки «Извлечь», которая, в свою очередь, вызывает функцию «checkOut», я хотел бы изменить ячейку рядом с камерами, на которые ссылается «Доступно», на имя студента.

Я новичок в скрипте Google Apps, но я знаю, что первым шагом к этому является перечисление каждой необходимой переменной, затем найдите значения корзины в списке оборудования и замените ячейку смещения значением Name.

Здесьмои переменные:

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 голосов
/ 11 февраля 2019

Попробуйте:

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;
}

Простая система CheckOut

Чтобы настроить эту систему, вам нужно будет скопировать все приведенные ниже сценарии в файл 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...