Получение булевых значений из флажков и добавление их в виде чисел на другом листе, например в базе данных - PullRequest
0 голосов
/ 16 апреля 2020

Привет, программисты Google Apps Script, Picture создает своего рода базу данных для магазина сэндвичей в Google Sheets, где большинство листов - это таблицы данных, а столбец 1 является полем автонумерации. Первый лист - это основная форма заказа с именем MySubShop. Он запишет номер заказа, кассира, клиента, дату / время и несколько флажков для продуктов. Второй лист называется «Поиск» и содержит поиск типов хлеба и напитков только потому, что люди могут выбрать только 1 тип хлеба и 1 напиток. Остальные листы похожи на таблицы базы данных и называются так: Хлеб, Мясо, Сыры, Приправы и Стороны.

На главном листе MySubShop во время заказа пользователь в основном нажимает на флажки рядом к продуктам питания, потому что пользователи могут выбрать> 1 элемент сверху. Например, для сыров можно проверить чеддер и проволон. То же самое относится к мясу, сторонам и т. Д. c.

. Нажмите кнопку, чтобы получить значения всех ячеек на листе заказа MySubShop, а затем установить эти значения на всех других листах.

Вопрос. Проблема в том, что я действительно хотел бы хранить значения как базу данных. Взять, к примеру, сыры. Если установлены флажки рядом с чеддером и проволоной, я бы хотел, чтобы листы получили эти значения, а затем на листе сыров выложите такие данные:

orderID, cheeseID
1, 1 где 1 будет = чеддер
1, 4 где 4 будет = проволоне

В отличие от базы данных, чеддер и проволоне определяются своими диапазонами на главном листе MySubShop. Чеддер - это флажок в ячейке G2, а проволоне - флажок в ячейке G5. Так что, если G2 отмечен как ИСТИНА, а если G5 - ИСТИНА, то получите эти значения и, нажав кнопку, установите эти значения.

Вопрос - я новичок в скрипте приложений и хотел бы получить некоторую помощь в выяснении некоторых из них код, например, для сыров. Как взять ИСТИННОЕ значение в ячейке G2 и изменить его на числовое значение в последнем ряду столбца 2 листа сыров.

Любая помощь по этому вопросу будет принята с благодарностью. Спасибо

    //GRAB ALL OF AN ORDER'S DATA ON MYSUBSHOP SHEET AND COPY IT TO THE OTHER SHEETS
    function setValuesAcrossSheets() {
      var mysheet = SpreadsheetApp.getActive().getSheetByName('MySubShop');

      //Get the order info
      var ordersvalues = [[mySubShop.getRange("B5").getValue(), 
                           mySubShop.getRange("B4").getValue(), 
                           mySubShop.getRange("B3").getValue(),
                           mySubShop.getRange("B2").getValue()]];

      orders.getRange(orders.getLastRow()+1, 1, 1, 4).setValues(ordersvalues);

      //increase the order number to get ready for the next order
      mySubShop.getRange("B5").setValue(newordernum+1);

//trying to figure out the best way to do this...
      var breadvalues = sheet.getRange("c2");  //a listbox that pulls options from another sheet
      var meatvalues = ['d5', 'd6', 'd7', 'd8', 'd9', 'd10']; //checkboxes in d5:d10
      var cheesevalues = ['g2', 'g3', 'g3', 'g4', 'g5']; //checkboxes in g2:g5
      var beveragevalues = sheet.getRange("f8"); //checkboxes in g2:g5
      var condimentvalues = ['j2', 'j3', 'j4', 'j5', 'j6', 'j7', 'j8']; //checkboxes in j2:j8
      var sidesvalues = ['m2', 'm3', 'm4', 'm5', 'm6']; //checkboxes in m2:m6

Ответы [ 4 ]

0 голосов
/ 17 апреля 2020

Я улучшил решение, используя массив. Надеюсь, что скорость значительно улучшится. Попробуйте.

Я ввел лист "Детализация". Как только заказ подтвержден, он записывается на этот лист в один go. Вы можете легко отфильтровать его.

Для удобства я предоставил запрос на всех других листах, которые извлекают данные из подробного листа.

https://docs.google.com/spreadsheets/d/10yvp5GFfR1b-I5fpuCbuhvkp_dahENowzQQZH6c9QOE/edit?usp=sharing


function confirm_order() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ordsht = ss.getSheetByName('MySubShop');
  var sumsht = ss.getSheetByName('Orders');
  var detsht = ss.getSheetByName("Detail")
  //var loksht = ss.getSheetByName('Lookups');
  //var metsht = ss.getSheetByName('Meats');
  //var brdsht = ss.getSheetByName('Breads');
  //var chssht = ss.getSheetByName('Cheeses');
  //var consht = ss.getSheetByName('Condiments');
  //var sidsht = ss.getSheetByName('Sides');
  //var bevsht = ss.getSheetByName('Beverages');
  var ordvals = ordsht.getRange("A1:M10").getValues();
  //Browser.msgBox(ordvals);
  var ordary=[];
  sumsht.appendRow([ordvals[4][1], ordvals[3][1],ordvals[2][1],ordvals[1][1] , ordvals[5][1] ]);//order list
  ordary.push(["Bread",ordvals[4][1], ordvals[1][2] , ordvals[5][1] ]);//bread
  ordary.push(["Beverage",ordvals[4][1], ordvals[7][5], ordvals[5][1] ]);//beverage
  //meat
  for (i=4;i<10;i++){
    if (ordvals[i][3]==true){
      ordary.push(["Meat",ordvals[4][1], ordvals[i][2], ordvals[5][1] ]);
    }//if
  }//for
  //cheese
  for (i=1;i<5;i++){
    if (ordvals[i][6]){
      ordary.push(["Cheese",ordvals[4][1], ordvals[i][5], ordvals[5][1] ]);
    }//if
  }//for
  //condiments
  for (i=1;i<8;i++){
    if (ordvals[i][9]){
      ordary.push(["Condiment",ordvals[4][1], ordvals[i][8] , ordvals[5][1]]);
    }//if
  }//for
  //sides
  for (i=1;i<6;i++){
    if (ordvals[i][12]){
      ordary.push(["Sides",ordvals[4][1], ordvals[i][11] , ordvals[5][1]]);
    }//if
  }//for
  //increase the order number to get ready for the next order
  ordsht.getRange("B5").setValue(ordvals[4][1]+1);
  detsht.getRange("A"+(detsht.getLastRow()+1)+":D"+(detsht.getLastRow()+ordary.length)).setValues(ordary);

}
//



0 голосов
/ 16 апреля 2020

Поскольку ваши флажки отображаются по вертикали, я бы создал скрытый столбец, содержащий идентификаторы продуктов питания.

Подход:

В качестве примера для сыров вы можете установить флажки для своих сыров в столбце G от строки 5 до строки 10. Предположим, что в столбце F, который будет скрыт, у меня есть идентификаторы из моих сыров.

Таким образом, я могу напрямую связать флажок с идентификатором сыра, не отфильтровывая фактические имена (я полагаю, в любом случае будет находиться в столбце рядом с флажками).

Вот пример:

let ss = SpreadsheetApp.getActiveSheet(); // MySubShop
let CheesIds = ss.getRange("F8:G12").getValues() // get the rows
                                    .filter(value=> value[1]) // the boolean value to filter the rows
                                    .flatMap(value => value[0]);  // the filtered cheese ids

Вы можете воспроизвести это поведение для всех остальных категорий и затем сгенерировать записи на соответствующих листах.

Если это невозможно на вашем листе, извините, пожалуйста, мое первоначальное предположение.

0 голосов
/ 16 апреля 2020

Я сделал для вас полную заявку.

Я добавил «Количество сэндвичей», так как в одном заказе может быть много одинаковых сэндвичей. Не нужно делать много заказов на это. Если вам это не нравится, просто введите количество «1» для всех заказов.


function confirm_order() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ordsht = ss.getSheetByName('MySubShop');
  var sumsht = ss.getSheetByName('Orders');
  var loksht = ss.getSheetByName('Lookups');
  var metsht = ss.getSheetByName('Meats');
  var brdsht = ss.getSheetByName('Breads');
  var chssht = ss.getSheetByName('Cheeses');
  var consht = ss.getSheetByName('Condiments');
  var sidsht = ss.getSheetByName('Sides');
  var bevsht = ss.getSheetByName('Beverages');
  var ordvals = ordsht.getRange("A1:M10").getValues();
  //Browser.msgBox(ordvals);
  sumsht.appendRow([ordvals[4][1], ordvals[3][1],ordvals[2][1],ordvals[1][1] , ordvals[5][1] ]);//order list
  brdsht.appendRow([ordvals[4][1], ordvals[1][2] , ordvals[5][1] ]);//bread
  bevsht.appendRow([ordvals[4][1], ordvals[7][5], ordvals[5][1] ]);//beverage
  //meat
  for (i=4;i<10;i++){
    if (ordvals[i][3]==true){
      metsht.appendRow([ordvals[4][1], ordvals[i][2], ordvals[5][1] ]);
    }//if
  }//for
  //cheese
  for (i=1;i<5;i++){
    if (ordvals[i][6]){
      chssht.appendRow([ordvals[4][1], ordvals[i][5], ordvals[5][1] ]);
    }//if
  }//for
  //condiments
  for (i=1;i<8;i++){
    if (ordvals[i][9]){
      consht.appendRow([ordvals[4][1], ordvals[i][8] , ordvals[5][1]]);
    }//if
  }//for
  //sides
  for (i=1;i<6;i++){
    if (ordvals[i][12]){
      sidsht.appendRow([ordvals[4][1], ordvals[i][11] , ordvals[5][1]]);
    }//if
  }//for
  //increase the order number to get ready for the next order
  ordsht.getRange("B5").setValue(ordvals[4][1]+1);
}
//


См. Лист здесь

https://docs.google.com/spreadsheets/d/1X97wIEHGxbRIzG4GEOZQOxwM7IPlGCgEHV7qcULLe78/edit#gid = 189012034

После настройки заказа просто нажмите «Порядок»

Вы можете улучшить его, например,

Сбросить все параметры после каждого заказа. Убедитесь, что по крайней мере один параметр выбран для каждого элемента, Ограничить число вариантов, скажем, макс. 3 (можно выбрать не более 3)

Если вы хотите, я сделаю это за вас.

Я скоро запрошу свой песочный переключатель !!! Ура!

0 голосов
/ 16 апреля 2020

Попробуйте это

//GRAB ALL OF AN ORDER'S DATA ON MYSUBSHOP SHEET AND COPY IT TO THE OTHER SHEETS
function setValuesAcrossSheets() {
  var mysheet = SpreadsheetApp.getActive().getSheetByName('MySubShop');

  //Get the order info
  var ordersvalues = mysheet.getRange("B2:B5").getValues();
  if (ordersvalues[0][0]=="TRUE") { ordersvalues[0][0]=1  } else {ordersvalues[0][0]=0}
  if (ordersvalues[1][0]=="TRUE") { ordersvalues[1][0]=1  } else {ordersvalues[1][0]=0}
  if (ordersvalues[2][0]=="TRUE") { ordersvalues[2][0]=1  } else {ordersvalues[2][0]=0}

  orders.getRange(orders.getLastRow()+1, 1, 1, 4).setValues([ordersvalues[3][0], ordersvalues[0][0],ordersvalues[1][0],ordersvalues[2][0] ]);

  //increase the order number to get ready for the next order
  mySubShop.getRange("B5").setValue(newordernum+1);



Если вы хотите сделать то же самое для многих циклов, вы можете сделать это внутри al oop, чтобы сделать код короче.

Pl. Поделитесь копией листа с правами редактирования publi c и вставьте сюда URL для лучшего понимания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...