найти и выбрать ячейку на основе URL в листах Google - PullRequest
2 голосов
/ 02 октября 2019

Я сделал простую базу данных для химикатов на основе листов Google. Лист выглядит так: https://docs.google.com/spreadsheets/d/e/2PACX-1vR0-AMEKNM3ZbDq67OIKWnc7E3KP8kfOsnr0Bjg2OSjpevLLjniknGXfIiiyZvbwE9bz3EfbOpO46ef/pubhtml?gid=292509613&single=true

Есть много строк и столбцов. Пользователь может изменить значение ячейки, используя URL-ссылку примерно так: https://docs.google.com/spreadsheets/d/13sLioJr_T6lqQ7y_pStBR8CKxReYwLUn4hao/edit#gid=292509613&range=B2

ссылка преобразуется в QR-код, который используется кем-то, кому необходимо удаленно изменить значение ячейки стелефон, без поиска определенного химического вещества вручную

Проблемы начинаются, когда кто-то вводит новую строку, а затем изменяется местоположение каждой ячейки, теперь все URL (то есть напечатанные QR-коды) выбирают неправильные химические вещества. Теперь все URL неверны, и я должен вручную исправить это и переместить новую строку в конец таблицы

В идеале я хотел бы выбрать ячейку с запросом на основе идентификатора химического вещества (в данном случаеcp1000) что-то вроде (в псевдокоде) docs.google.com/spreadsheets/d/13sLioJr..../edit#gid=292509613&range=(select ячейки B (row_number), где ячейка A содержит (cp1000))

Примером успешного результата будет выбор ячейки в столбце B на основе столбца A

в псевдокоде:

 cell = Cell()
 id = query.exctract_id()
 for n in range(1,max_row):
    if cell(column_number = 'A', row_number = n).value == id:
        select cell(column_number ='B', row_number = n)
        break

. Есть ли способ записать его в URL? Большое спасибо заранее

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Спасибо за ваше предложение. Я действительно закончил тем, что сделал простое веб-приложение на 1 страницу. JS на самом деле удивительно легко выучить. Я использую несколько странный способ передачи переменных из функции doGet (), сохраняя их в электронной таблице, поскольку может возвращать только вывод html с помощью функции.

function doGet(e){
  var url = "https://docs.google.com/spreadsheets/d/13sLioJr_T6lRODrvGSqQ7y_pStBR8CKxReYwLUn4hao/edit#gid=0";
  var [ID, chemical, totalAmount, name, targetRow, unit] = fill(e);
  var ss = SpreadsheetApp.openByUrl(url).getSheetByName("Supplementary");
  ss.getRange("B5").setValue(ID);
  ss.getRange("B6").setValue(name);
  ss.getRange("B7").setValue(targetRow);
  ss.getRange("B8").setValue(Session.getActiveUser().getEmail());
  Logger.log(ID);
  var data = {ID:ID, chemical :chemical, totalAmount :totalAmount, unit :unit};
   var html = HtmlService
      .createTemplateFromFile('FrontEnd.html')
      .evaluate()
      .getContent();
   return HtmlService
     .createTemplate(html +    
       "<script>\n" + 
        "postChemicals( " +
        JSON.stringify(data) +
        ");\n</script>")
        .evaluate();
}
//  


function fill(e){
  // this function extracts event parameters and gets a cell from spreadsheet with query from URL
  // where name equals to spreadsheet name and ID to the chemical ID generated by "Code.gs"
  var url = "<post your url>";
    var ID = e.parameter.ID;
    var name = e.parameter.name;
  var targetRow =getCell(ID,name);
  var sheet = SpreadsheetApp.openByUrl(url).getSheetByName(name);
  var chemical = sheet.getRange("B"+targetRow).getValue()
  var totalAmount = sheet.getRange("D"+targetRow).getValue()- 
  sheet.getRange("C"+targetRow).getValue();
  var takenCell = sheet.getRange("C"+targetRow);
  var unit = sheet.getRange("E"+targetRow).getValue();
  Logger.log("fill(e) called");
  return [ID, chemical, totalAmount,name, targetRow, unit ]
}

function getCell(chemNo, name){
  var url = "https://docs.google.com/spreadsheets/d/13sLioJr_T6lRODrvGSqQ7y_pStBR8CKxReYwLUn4hao/edit#gid=0";
 // this is a function that searches for a cell
  //get the first sheet of your 
  var sheet = SpreadsheetApp.openByUrl(url).getSheetByName(name);
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange('A1:A' + lastRow).getValues();

  for(var i = 0; i < lastRow; i++){
    if(range[i] == chemNo){
      return  (i + 1);
    }
  }
0 голосов
/ 04 октября 2019

Ответ:

Вы можете создать веб-приложение, которое перенаправит на нужную ячейку на основе результата условного оператора.

Подробности:

Вы можете установить каждый из QR-кодов, чтобы они содержали идентификатор химического вещества в качестве параметра URL, а затем загрузить лист на основе значения параметра:

Пример URL-адреса веб-приложения:

https://script.google.com/a/google.com/macros/s/<web-app-ID>/exec?chemNo=cp1000

Код скрипта приложения:

funciton doGet(e){
  var sheetUrl = "<your-spreadsheet-URL-with-gid>";
  var cell = getCell(e.parameter.chemNo, url);

  return HtmlService.createHtmlOutput('<script>window.location.replace("' + sheetUrl + '&range=' + cell + '"</script>');
}

function getCell(chemNo, url){

  //get the first sheet of your 
  var sheet = SpreadsheetApp.openByUrl(url).getSheets()[0];
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange('A1:A' + lastRow).getValues();

  for(var i = 0; i < lastRow; i++){
    if(range[i] == chemNo){
      return 'B' + (i + 1);
    }
  }
}

Это позволит получить параметр, найти, в какой строке он находится, и вернуть ячейку BX, где X - соответствующая строка, в которой находится chemNo, и, наконец, перенаправление на лист с диапазоном нужной ячейки.

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