【问题标题】:Linking two cell values together in Google Sheets在 Google 表格中将两个单元格值链接在一起
【发布时间】:2018-12-18 23:54:56
【问题描述】:

您好,感谢您的帮助,

我正在寻找一种在 Google 表格中将 2 个单元格链接在一起的方法,其中一个单元格的输出将取决于另一个单元格的输入。

我举个例子 我有一个带有代码的列数据库,旁边有相应的名称,下面是简单的示例。

DATABASE 1
     CODE | NAME
     -----------
       146  |  Aba
       234  |  Bac
       365  |  Cge

在填写订单时,我希望能够输入代码,工作表将自动查找名称并填写,或者输入名称,工作表将自动填写代码。

示例:

Order 1
my input                       finished
     CODE | NAME                 CODE | NAME
     -----------  -> PROCESS ->  -----------
     146  |                      146  |  Aba 
          |  Cge                 365  |  Cge 

我正在寻找获得所需解决方案的“过程”。我自己不擅长编码,也不知道从哪里开始,但我在想一种解决方案可能是使用 VLOOKUP 函数向下走每一行,检查 CODE 列中是否有值,然后 VLOOOKUP数据库中对应的NAME 值,如果没有CODE 值,则查看是否有NAME 值和VLOOKUP CODE 值。然后移动到下一行。

感谢您抽出宝贵时间阅读本文,感谢您的帮助。

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-formula google-sheets-macros


    【解决方案1】:

    将列字母转换为数字或将数字转换为字母

    您可以使用这些功能执行您所描述的操作。我有 ascii 到字符和列字母到列号示例。将所有这些函数复制到 Code.gs 中,然后您必须转到一个空白页面并将其重命名为“联系人”,然后运行 ​​setupOnEdit() 函数。我选择使用 A 列和 B 列。现在的设置方式是,如果您以字母键入电子表格列,那么列号将出现在相邻列中。或者,如果您输入列号,则字母将出现在另一列中。我想你只是想让每一列都走一条路。这是可能的。我将把它作为练习留给读者。

    function getASCIIObject(){
      var aObj={};
      for(var i=32;i<127;i++){
        var s=Utilities.formatString('%s',String.fromCharCode(i));
        if(s!='='){
          aObj[i]=s;
          aObj[s]=i;
        }
      }
      return aObj;
    }
    
    function getColumnsObject(){
      var cObj={};
      var chA=[];
      var colA=[];
      for(var i=65;i<=90;i++){chA.push(String.fromCharCode(i));}
      for(var i=0;i<10;i++){
        for(var j=0;j<26;j++){
          if(i==0){
            colA.push(chA[j]);
          }
          if(i>0){
            colA.push(chA[i-1] + chA[j]);
          }
        }
      }
      for(var i=0;i<colA.length;i++){
        cObj[i+1]=colA[i];
        cObj[colA[i]]=i+1;
      }
      return cObj;
    }
    
    
    function dCode(key,mode){
      if(key){
        var mode=mode || 'ASCII';
        if(mode=='ASCII'){
          var dObj=getASCIIObject();
          return dObj[key];
        }
        if(mode=='COLUMNS'){
          var dObj=getColumnsObject();
          return dObj[isNaN(key)?key.toUpperCase():key];
        }  
        if(mode=='DICT'){
          var dObj=getMyDictionary();
          return dObj[key];
        } 
      }
      throw('Error; Invalid params in dCode()');
    }
    
    function setupEditTrigger(funcName) {  
      if(ScriptApp.getProjectTriggers().indexOf(funcName)==-1){
        ScriptApp.newTrigger(funcName).forSpreadsheet(getGlobal('SSId')).onEdit().create();
      }
    }
    
    function setupOnEdit(){
      setupEditTrigger('decodeColumns');
    }
    
    function decodeColumns(e){
      var rg=e.range;
      var sh=rg.getSheet();
      var col=rg.getColumn();
      var row=rg.getRow();
      var value=rg.getValue();
      Logger.log('rg: %s sh: %s col: %s row: %s value: %s',rg.getA1Notation(),sh.getName(),col,row,value);
      if(sh.getName()=='Contacts' && col==1){
        rg.offset(0,+1).setValue(dCode(value,'DICT'));
      }
      if(sh.getName()=='Contacts' && col==2){
        rg.offset(0,-1).setValue(dCode(value,'DICT'));
      }
    }
    
    function getMyDictionary(sheetname,keycolumn){
      var sheetname=sheetname ||'Dictionary';
      var keycolumn=keycolumn || 1;
      var valuecolumn=keycolumn + 1;
      var dObj={};
      if(sheetname && keycolumn){
        var ss=SpreadsheetApp.getActive();
        var sh=ss.getSheetByName(sheetname);
        var rg=sh.getRange(1,keycolumn,sh.getLastRow(),2);
        var codeA=rg.getValues();
        for(var i=0;i<codeA.length;i++){
          if(codeA[i][0]){
            dObj[codeA[i][0]]=codeA[i][1];
          }else{
            break;
          }
        }
        return dObj;
      }else{
        throw('Error: Invalid params in getMyDictionary()');
      }
    }
    

    这是第二个版本,它为您提供了两个字典选项卡。一个是Dictionary,另一个是Dictionary2。当然,您可以将它们更改为您想要的任何内容。

    function getASCIIObject(){
      var aObj={};
      for(var i=32;i<127;i++){
        var s=Utilities.formatString('%s',String.fromCharCode(i));
        if(s!='='){
          aObj[i]=s;
          aObj[s]=i;
        }
      }
      return aObj;
    }
    
    function getColumnsObject(){
      var cObj={};
      var chA=[];
      var colA=[];
      for(var i=65;i<=90;i++){chA.push(String.fromCharCode(i));}
      for(var i=0;i<10;i++){
        for(var j=0;j<26;j++){
          if(i==0){
            colA.push(chA[j]);
          }
          if(i>0){
            colA.push(chA[i-1] + chA[j]);
          }
        }
      }
      for(var i=0;i<colA.length;i++){
        cObj[i+1]=colA[i];
        cObj[colA[i]]=i+1;
      }
      return cObj;
    }
    
    
    function dCode(key,mode){
      if(key){
        var mode=mode || 'ASCII';
        if(mode=='ASCII'){
          var dObj=getASCIIObject();
          if(dObj.hasOwnProperty(key)){
            return dObj[key];
          }
        }
        if(mode=='COLUMNS'){
          var dObj=getColumnsObject();
          key=isNaN(key)?key.toUpperCase():key;
          if(dObj.hasOwnProperty(key)){
            return dObj[key];
          }
        }  
        if(mode=='DICT1'){
          var dObj=getMyDictionary();
          if(dObj.hasOwnProperty(key)){
            return dObj[key];
          }
        } 
        if(mode=='DICT2'){
          var dObj=getMyDictionary('Dictionary2');
          if(dObj.hasOwnProperty(key)){
            return dObj[key];
          }   
        } 
      }else{
        throw('Error; Invalid params in dCode()');
      }
      return nill;
    }
    
    function setupEditTrigger(funcName) {  
      if(ScriptApp.getProjectTriggers().indexOf(funcName)==-1){
        ScriptApp.newTrigger(funcName).forSpreadsheet(getGlobal('SSId')).onEdit().create();
      }
    }
    
    function setupOnEdit(){
      setupEditTrigger('decodeColumns');
    }
    
    function decodeColumns(e){
      var rg=e.range;
      var sh=rg.getSheet();
      var col=rg.getColumn();
      var row=rg.getRow();
      var value=rg.getValue();
      Logger.log('rg: %s sh: %s col: %s row: %s value: %s',rg.getA1Notation(),sh.getName(),col,row,value);
      if(sh.getName()=='Contacts' && col==1){
        rg.offset(0,+1).setValue(dCode(value,'DICT1'));
      }
      if(sh.getName()=='Contacts' && col==2){
        rg.offset(0,-1).setValue(dCode(value,'DICT2'));
      }
    }
    
    function getMyDictionary(sheetname,keycolumn){
      var sheetname=sheetname ||'Dictionary';
      var keycolumn=keycolumn || 1;
      var valuecolumn=keycolumn + 1;
      var dObj={};
      if(sheetname && keycolumn){
        var ss=SpreadsheetApp.getActive();
        var sh=ss.getSheetByName(sheetname);
        var rg=sh.getRange(1,keycolumn,sh.getLastRow(),2);
        var codeA=rg.getValues();
        for(var i=0;i<codeA.length;i++){
          if(codeA[i][0]){
            dObj[codeA[i][0]]=codeA[i][1];
          }else{
            break;
          }
        }
        return dObj;
      }else{
        throw('Error: Invalid params in getMyDictionary()');
      }
    }
    

    【讨论】:

    • 您好,感谢您的帮助,但代码/名称不仅仅是列号
    • 他们可以是任何你想让他成为的人。你希望他们成为什么样的人?
    • 它基本上是一本字典。它是用对象属性构造的,在这种情况下,我有键值对和值键对,因此转换是双向的。
    • 我修改了答案,现在设置为从名为 Dictionary 的工作表(选项卡)的前两列构建字典对象。您将键放在第一列,将值放在第二列。它们可以是任何你想要的。
    • 我添加了第二个版本,它为您提供了两个字典,以便您可以为您更改的每一列使用不同的字典。你可以输入任何你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多