Как создать заметку в ячейке электронной таблицы на основе значения выбранной ячейки - PullRequest
1 голос
/ 30 января 2020

Чтобы заставить эту специфическую c функцию работать, я пробую ее на простом тестовом листе.

У меня есть два листа (STATUS и FEBRUARI) в листе FEBRUARI, который я имею выбрал определенную ячейку. Эта ячейка имеет значение. Сценарий, который я хочу сделать, - это посмотреть на это значение, найти его в листе STATUS (скажем, он находит его в A1) и вернуть значение в B1 примечанию к ячейке в выбранной ячейке на листе FEBRUARI. Например: в ячейке написано «Проект 6», а в примечании к ячейке содержится информация об этом проекте.

Это то, что я получил. Это дает мне определенное значение (-1), но, кажется, не имеет значения, куда я помещаю значение поиска ... оно всегда возвращает -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 ]

1 голос
/ 30 января 2020

Согласно Google предпочтительно использовать 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]; }); });
}

0 голосов
/ 30 января 2020
  var lookup = sheet.getRange(1,1,1,lc).getValues();
  var index = lookup.indexOf(lookupvalue)

Первая строка возвращает двумерный массив. indexOf () работает только для плоских массивов. Попробуйте использовать:

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