-2

您好,感谢您的帮助,

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

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

4

1 回答 1

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()');
  }
}
于 2018-12-19T06:25:20.173 回答