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

时间:2020-01-29 21:16:59

标签: javascript google-apps-script google-sheets vlookup

要使此特定功能正常工作,我正在一个简单的测试表中对其进行尝试。

我在FEBRUARI工作表中有两个工作表(状态和FEBRUARI),我选择了某个单元格。该单元格具有一个值。我要脚本执行的操作是查看该值,然后在STATUS表中找到该值(例如,它在A1中找到了它),然后将B1中的值返回到FEBRUARI表中所选单元格中的单元格注释中。例如:在单元格中显示“ Project 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);
};


}

2 个答案:

答案 0 :(得分:0)

  var lookup = sheet.getRange(1,1,1,lc).getValues();
  var index = lookup.indexOf(lookupvalue)

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

var lookup = sheet.getRange(1,1,1,lc).getValues()[0];

答案 1 :(得分:0)

According to Google preferably use getCurrentCell()而不是getActiveCell(),因为它返回当前突出显示(或选定)的单元格。

您的onOpen()函数也应位于noteSetter()函数之外,否则在电子表格打开时不会被调用。

以下代码将完成您想要的工作表。如果数据顺序被更改,则必须相应地更改范围公式。

/* 
 * This function will run when the Spreadsheet is opened and,
 * will add a Menu item for the noteSetter function 
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Set cell note",
    functionName : "noteSetter"
  }];
  sheet.addMenu("My Menu", entries);
};

function noteSetter() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("STATUS"); //source sheet
  var sheet2 = ss.getSheetByName("FEBRUARI"); //result sheet
  var noteCell = sheet2.getCurrentCell();
  var lookUpValue = noteCell.getValue();

  // Search through Col C in "STATUS" sheet to get the matching row
  // You need to transpose the lookUpRange 
  var lookUpRange = sheet.getRange(2,3,sheet.getDataRange().getLastRow(),1).getValues();
  lookUpRange = transpose(lookUpRange);

  var index = lookUpRange[0].indexOf(lookUpValue);  // Starts at 0
  var row = index + 2;  // One for the omitted header and one because rows start at 1
  var note = sheet.getRange(row,7).getValue();

  noteCell.setNote(note);

}

// You need to transpose to avoid looping through the array
function transpose(a)
{
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}