Google apps script 在Google工作表中将两个单元格值链接在一起

Google apps script 在Google工作表中将两个单元格值链接在一起,google-apps-script,google-sheets,google-sheets-formula,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Formula,Google Sheets Macros,嗨,谢谢你的帮助 我正在寻找一种方法将谷歌表单中的两个单元格链接在一起,其中一个单元格的输出将取决于另一个单元格的输入 让我举个例子 我有一个带有代码的列数据库,旁边是相应的名称,下面是一个简单的示例 DATABASE 1 CODE | NAME ----------- 146 | Aba 234 | Bac 365 | Cge 当填写订单时,我希望能够输入代码,工作表将自动查找名称并填写,或者输入名称,工作表将自动填写

嗨,谢谢你的帮助

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

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

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函数向下搜索每一行,检查代码列中是否有值,然后VLOOKUP从数据库中查找相应的名称值,如果没有代码值,然后查看是否有NAME值和VLOOKUP代码值。然后移到下一行

感谢您花时间阅读此文章,我非常感谢您的帮助。

将列字母转换为数字或将数字转换为字母 您可以使用这些函数执行所描述的操作。我有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()');
  }
}
函数getAsciioObject(){ var aObj={};
对于(var i=32;iHi,谢谢你的帮助,但是代码/名称不仅仅是列号,它们可以是你想要的任何东西。你希望它们是什么?它基本上是一个字典。它是用对象属性构造的,在这种情况下,我有键值对和值键对,因此转换是双向的。我修改了答案,现在设置为从工作表(选项卡)的前两列构建dictionary对象命名字典。您将键放在第1列,将值放在第2列。它们可以是您想要的任何内容。我添加了第二个版本,该版本为您提供了两个字典,以便您可以为更改的每一列使用不同的字典。您可以输入任何您想要的内容。
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()');
  }
}