将 Google 工作表中的两个单元格值链接在一起
Linking two cell values together in Google Sheets
您好,感谢您的帮助,
我正在寻找一种方法将 link 2 个单元格放在 Google 工作表中,其中任何一个的输出将取决于另一个的输入。
举个例子
我有一个带有代码的列数据库,旁边是相应的名称,下面是一个简单的例子。
DATABASE 1
CODE | NAME
-----------
146 | Aba
234 | Bac
365 | Cge
填写订单时,我希望能够输入代码,sheet 将自动查找名称并填写,或者输入名称,sheet 将自动填写代码。
示例:
Order 1
my input finished
CODE | NAME CODE | NAME
----------- -> PROCESS -> -----------
146 | 146 | Aba
| Cge 365 | Cge
我想弄清楚 "process" 可能是什么以获得所需的解决方案。我不擅长自己编码,也不知道从哪里开始,但我在想一个解决方案是使用 VLOOKUP 函数向下查看每一行,检查 CODE 列中是否有值,然后 VLOOOKUP从数据库中获取对应的NAME值,如果没有CODE值,则查看是否有NAME值,VLOOKUP CODE值。然后移动到下一行。
感谢您花时间阅读本文,感谢您的帮助。
将列字母转换为数字或将数字转换为字母
您可以使用这些函数执行您描述的操作。我有 ascii 到字符和列字母到列号的例子。将所有这些函数复制到 Code.gs 中,然后您必须转到一个空白页面并将其重命名为 'Contacts',然后 运行 setupOnEdit() 函数。我选择使用 A 列和 B 列。现在的设置方式是,如果您用字母键入电子表格列,则列号将出现在相邻的列中。或者,如果您输入列号,则这些字母将出现在另一列中。我认为您只是希望每一列都以一种方式进行。这是可能的。我将把它留作 reader.
的练习
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()');
}
}
您好,感谢您的帮助,
我正在寻找一种方法将 link 2 个单元格放在 Google 工作表中,其中任何一个的输出将取决于另一个的输入。
举个例子 我有一个带有代码的列数据库,旁边是相应的名称,下面是一个简单的例子。
DATABASE 1
CODE | NAME
-----------
146 | Aba
234 | Bac
365 | Cge
填写订单时,我希望能够输入代码,sheet 将自动查找名称并填写,或者输入名称,sheet 将自动填写代码。
示例:
Order 1
my input finished
CODE | NAME CODE | NAME
----------- -> PROCESS -> -----------
146 | 146 | Aba
| Cge 365 | Cge
我想弄清楚 "process" 可能是什么以获得所需的解决方案。我不擅长自己编码,也不知道从哪里开始,但我在想一个解决方案是使用 VLOOKUP 函数向下查看每一行,检查 CODE 列中是否有值,然后 VLOOOKUP从数据库中获取对应的NAME值,如果没有CODE值,则查看是否有NAME值,VLOOKUP CODE值。然后移动到下一行。
感谢您花时间阅读本文,感谢您的帮助。
将列字母转换为数字或将数字转换为字母
您可以使用这些函数执行您描述的操作。我有 ascii 到字符和列字母到列号的例子。将所有这些函数复制到 Code.gs 中,然后您必须转到一个空白页面并将其重命名为 'Contacts',然后 运行 setupOnEdit() 函数。我选择使用 A 列和 B 列。现在的设置方式是,如果您用字母键入电子表格列,则列号将出现在相邻的列中。或者,如果您输入列号,则这些字母将出现在另一列中。我认为您只是希望每一列都以一种方式进行。这是可能的。我将把它留作 reader.
的练习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()');
}
}