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()');
}
}