Javascript 如何基于选定单元格的值在电子表格单元格上创建注释

Javascript 如何基于选定单元格的值在电子表格单元格上创建注释,javascript,google-apps-script,google-sheets,vlookup,Javascript,Google Apps Script,Google Sheets,Vlookup,为了让这个特定的函数工作,我正在一个简单的测试表中进行测试 我在二月的工作表中有两个工作表(STATUS和FEBRUARI),我选择了某个单元格。此单元格有一个值。我希望脚本做的是查看该值,在状态表中找到该值(比如在A1中找到该值),然后将B1中的值返回到二月工作表中所选单元格的单元格注释中。例如:单元格中写着“项目6”,单元格注释给出了有关该项目的信息 这就是我得到的。这给了我一个特定的值(-1),但我把lookupvalue放在哪里似乎并不重要。。它总是返回-1 // My Scri

为了让这个特定的函数工作,我正在一个简单的测试表中进行测试

我在二月的工作表中有两个工作表(STATUS和FEBRUARI),我选择了某个单元格。此单元格有一个值。我希望脚本做的是查看该值,在状态表中找到该值(比如在A1中找到该值),然后将B1中的值返回到二月工作表中所选单元格的单元格注释中。例如:单元格中写着“项目6”,单元格注释给出了有关该项目的信息

这就是我得到的。这给了我一个特定的值(-1),但我把lookupvalue放在哪里似乎并不重要。。它总是返回-1

    // My Script

function noteSetter() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var lookupvalue = SpreadsheetApp.getActiveSheet().getActiveCell().getValue();
  var sheet = ss.getSheetByName("STATUS"); //source sheet
  var sheet2 = ss.getSheetByName("FEBRUARI"); //result sheet
  var cellnote = SpreadsheetApp.getActiveSheet().getActiveCell();
  var lc = sheet.getLastColumn()
  var lookup = sheet.getRange(1,1,1,lc).getValues() //
  var index = lookup.indexOf(lookupvalue)


  cellnote.setNote(index);


  // This part will actually run the script once it's up and running
  function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
  name : "Set cell note",
    functionName : "noteSetter"
  }];
  sheet.addMenu("Scripts", entries);
};


}
第一行返回一个二维数组。indexOf()仅适用于展平数组。尝试使用:

var lookup = sheet.getRange(1,1,1,lc).getValues()[0];
getCurrentCell()
而不是
getActiveCell()
,因为它返回当前高亮显示(或选定)的单元格

另外,
onOpen()
函数应该在
noteSetter()函数的外部,否则在电子表格打开时不会调用它

下面的代码将为类似您的工作表执行所需的操作。如果更改了数据顺序,则必须相应地更改范围公式

/*
*此功能将在打开电子表格时运行,
*将为noteSetter函数添加一个菜单项
*/
函数onOpen(){
var sheet=SpreadsheetApp.getActiveSpreadsheet();
变量项=[{
名称:“设置单元格注释”,
函数名:“noteSetter”
}];
sheet.addMenu(“我的菜单”,条目);
};
函数noteSetter(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“状态”);//源工作表
var sheet2=ss.getSheetByName(“FEBRUARI”);//结果表
var noteCell=sheet2.getCurrentCell();
var lookUpValue=noteCell.getValue();
//搜索“状态”表中的C列以获得匹配行
//您需要转换lookUpRange
var lookUpRange=sheet.getRange(2,3,sheet.getDataRange().getLastRow(),1.getValues();
lookUpRange=转置(lookUpRange);
var index=lookUpRange[0]。indexOf(lookUpValue);//从0开始
var row=index+2;//一个用于省略的标题,另一个是因为行从1开始
var note=sheet.getRange(第7行).getValue();
noteCell.setNote(note);
}
//您需要转置以避免在数组中循环
函数转置(a)
{
返回Object.keys(a[0]).map(函数(c){returna.map(函数(r){returnr[c];});});
}

对于每个项目,“状态”表中的数据是否按列组织?要匹配的值应该在一行中查找(例如,查看第1行中的所有值),还是要匹配的值可以在“状态”表中的任何位置?您好!是的,它是按列组织的。第1列:日期第2列:名称第3列:添加信息等。因此,可以在第2列中找到匹配值(以项目6为例),注释应在第3列中获得同一行的值。希望如此,你也可以分享一个测试ss的链接。删除任何敏感数据(如果有)!噢,嘘!它有进展了!酷。现在唯一的事情是它将值返回到单元格,而不是单元格的注释。它似乎不是在看“当前单元格”的值,我需要添加当前单元格的“获取值”吗?我在脚本中输入了一个错误,
noteCell.setValue(注)应更改为
noteCell.setNote(注释)。如果答案对您有效,请接受并向上投票,但将“notecell.setvalue(note)”更改为notecell.setNote(note)”会将值返回给注释。现在我只需要调整返回值,你说的“返回值”是什么意思。哪个函数的返回值?2月的“当前单元格”项目6现在设置为“332514”,与状态表中项目4的第7列相匹配。
var lookup = sheet.getRange(1,1,1,lc).getValues()[0];