在Google表格中将两个单元格值链接在一起

时间:2018-12-18 23:54:56

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

您好,谢谢您的帮助,

我正在寻找一种在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值。然后移至下一行。

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

1 个答案:

答案 0 :(得分:1)

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

您可以使用这些功能执行描述的内容。我对字符和列字母对列号的示例有ascii。将所有这些功能复制到Code.gs中,然后您必须转到空白页并将其重命名为“ Contacts”,然后运行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()');
  }
}