Как перетащить указанную строку c из одной электронной таблицы в другую, обновить ее, а затем заменить на исходный лист - PullRequest
0 голосов
/ 23 января 2020

Итак, у меня есть два отдельных листа, один со списком данных, полным уникальных имен, их местоположения и текущего статуса. Второй будет иметь ввод для ввода чьего-либо имени, и он будет тянуть строку, которая содержит их текущее местоположение / статус (первая функция), оттуда я мог бы изменить статус и запустить вторую функцию, которая обновляет первый лист с новым статусом , Я весь день гуглил, пытаясь собрать воедино что-то, что сработало бы, и я думаю, что я почти на первой функции, но я застрял, и любая помощь, чтобы указать мне правильное направление, была бы очень признательна.

В идеале первая функция сработает при вводе имени, а вторая сработает при изменении статуса, но я могу найти обходной путь, если это необходимо.

    function dataPull() {
     var data = SpreadsheetApp.openById('Spreadsheet_ID'); //replace with Data spreadsheet ID
     var filteredRows = data.filter(function (data) {
        var employee = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('b2').getValue();
        if (data[1] === employee) {
        return data
        }
     });
      SpreadsheetApp.getActiveSheet().getRange('A2:D').setValue(filter) 
    }

Вот несколько скриншотов, которые, надеюсь, лучше объяснят, что Я ищу, чтобы совершить sh.

Пример данных

Введите имя кого-либо на листе ввода

Подтянуть текущее состояние с функцией одна

Обновление статуса и запустить функцию два

Пример обновления данных для отражения изменений в состоянии

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вы не можете использовать встроенный триггер onEdit(e); поскольку он ведет себя так же, как и пользовательская функция, например (ограничено только листом, к которому он привязан).

Вы можете установить триггер в связанном скрипте и заставить его выполнять вашу неограниченную функцию.

function importData(e){
  // Get the cell where the user picked its name
  var range = e.range;   
  // The Id of your data source sheet
  var dataSheetId = 'XXXXXXXXXXXXX';  
  // Get all values from source sheet as an array  
  var data_values = SpreadsheetApp.openById(dataSheetId).getDataRange().getDisplayValues();
  // Return the row with data for matching employee
  var filteredRow = data_values.filter(check)[0];
  // Input location data in input sheet
  SpreadsheetApp.getActiveSheet().getRange(range.getRow(),range.getColumn()+1).setValue(filteredRow[2]);
}

function check(row) {
  // Get the name that the user picked
  var employee_name = SpreadsheetApp.getActiveSheet().getActiveCell().getValue();
  // Check if it matches and return the row
  if (row[1].toLowerCase() === employee_name.toLowerCase()) {
    return row
  }
}

Вы можете установить триггер из скрипта приложений, выполнив Редактировать / Триггеры текущего проекта / Добавить триггер .

В качестве источника события для триггера выберите: "From spreadsheet"; и для запуска функции выберите "importData" (или название вашей функции).

0 голосов
/ 23 января 2020

Редактировать диалог в листе

Эта функция состоит из двух разделов. Верхний раздел запускает редактирование на листе редактирования в столбце 2 и строке 2, который представляет собой раскрывающийся список, содержащий все имена в листе данных. При редактировании здесь запускается верхняя секция, которая считывает данные на листе данных и подает соответствующее имя, когда находит, что строка загружена в столбцы с 1 по 4 и строку 2 листа редактирования. Затем вы можете отредактировать статус и установить флажок, чтобы сохранить его обратно на лист данных. Затем нижняя часть запускает установленный флажок сброса, очищает диапазон редактирования и загружает изменения обратно в таблицу данных.

Пожалуйста, посмотрите на анимацию, чтобы увидеть процесс в действии.

Просто, чтобы вы знали заранее, вы можете запустить эту функцию из редактора сценариев, вы должны поместить ее в свой лист и Назовите свои листы правильно. Вы также должны настроить проверки данных для двух раскрывающихся списков. Если вы попытаетесь запустить эту функцию из редактора сценариев, вы получите Ошибка: не удается найти метод getsheet () с неопределенным

function onEdit(e) {
  e.source.toast('Entry');
  var sh=e.range.getSheet();
  if(sh.getName()=='Edit' & e.range.columnStart==2 && e.range.rowStart==2) {
    e.source.toast('flag1');
    var found=false;
    var dsh=e.source.getSheetByName('Data');
    var vA=dsh.getRange(2,1,dsh.getLastRow()-1,dsh.getLastColumn()).getValues();
    for(var i=0;i<vA.length;i++) {
      if(vA[i][1]==e.range.getValue()) {
        sh.getRange(2,1,1,4).setValues([vA[i]]);
        found=true;
        e.source.toast('Value Found at i = ' + i + 'value = ' + vA[i][1],'',-1);
        break;
      }
    }
    if(!found) {
      e.source.toast('No Value found = ' + e.value); 
    }
    Logger.log(vA);
  }
  if(sh.getName()=='Edit' & e.range.columnStart==5 && e.range.rowStart==2) {
    e.range.setValue("FALSE");
    dsh=e.source.getSheetByName('Data');
    dsh.getRange(Number(e.range.offset(0,-4).getValue()+1),4).setValue(e.range.offset(0,-1).getValue());
    sh.getRange(2,1,1,4).clearContent();
  }
}

Таблица данных:

enter image description here

Редактировать лист:

enter image description here

Анимация:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...