根据谷歌表格中的 URL 查找并选择一个单元格

Posted

技术标签:

【中文标题】根据谷歌表格中的 URL 查找并选择一个单元格【英文标题】:find and select a cell based on URL in google sheets 【发布时间】:2020-02-01 03:50:23 【问题描述】:

我使用 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

链接被转换为二维码,供需要通过手机远程更改手机值的人使用,无需手动搜索特定化学品

当有人引入新行时,问题就开始了,然后每个单元格的位置发生了变化,现在所有的 url(即打印的 QR 码)都选择了错误的化学物质。现在所有的 url 都是错误的,我必须手动修复这个并将新行移动到表格的底部

理想情况下,我希望选择一个基于化学品 ID 进行查询的单元格(在本例中为 cp1000) 类似的东西(在伪代码中) docs.google.com/spreadsheets/d/13sLioJr..../edit#gid=292509613&range=(select cell B(row_number) where cell A contains(cp1000))

成功结果的一个示例是根据 A 列选择 B 列中的单元格

在伪代码中:

 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

有没有办法写在网址里?

【问题讨论】:

你能提供你期望的结果吗?当然,请删除您的个人信息。顺便说一句,在您的问题中,有 3 种端点,它们是 docs.google.com/spreadsheets/d/e/###/pubhtmldocs.google.com/spreadsheets/d/###/editdocs.google.com/spreadsheets/d/###/editedit。我可以问问你吗? 能否分享一份您的电子表格副本,并附上一个成功结果的示例(以伪代码形式)。 用伪代码示例更正了我的文本。网址中的“editedit”是一个错字 【参考方案1】:

感谢您的建议。 我确实最终制作了一个简单的 1 页 web 应用程序。 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);
    
  

【讨论】:

【参考方案2】:

答案:

您可以构建一个网络应用程序,该应用程序根据条件语句的结果重定向到您需要的单元格。

详情:

您可以将每个二维码设置为包含化学 ID 作为 URL 参数,然后根据参数的内容加载工作表:

示例网络应用 URL:

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

应用脚本代码:

function 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所在的相应行,最后重定向到具有该单元格范围的工作表你需要。

【讨论】:

以上是关于根据谷歌表格中的 URL 查找并选择一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌表格中的另一个单元格引用公式

谷歌表格中是不是有办法选择单元格列表作为数组用作连接表格中的参数?

Excel - 在表格中查找值并根据以前的数据填充空白单元格

excel表格怎么提取单元格中的部分内容

谷歌表格,如何根据来自另一个单元格的字符串更改单元格

如何使用 R 模型为谷歌表格中的单元格供电?