Как определить переменную для строк данных, которые перемещаются - PullRequest
0 голосов
/ 19 февраля 2019

Эта функция работает автономно для перемещения ряда данных на другой лист.Я понимаю, что мне нужно захватить эту строку данных в переменную, чтобы я мог обработать ее в другой функции.Но я рассмотрел и попробовал различные идеи для захвата строки, используя уже определенные там переменные, но недели идут без прогресса.

function onEdit(e){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var row = r.getRow();
  var column = r.getColumn();
  //moving from the Form Responses 1 sheet to the Processed sheet
  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Processed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  }
  var ProOrd = HtmlService.createHtmlOutput(target);
  SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}

Может кто-нибудь показать, как получить эту строку в переменную для массажа послепросто переместить его на другой лист?


Я хочу взять эти «целевые» данные и вытолкнуть их в диалоговое окно.Конечный пользователь поместит информацию в другое программное обеспечение и закроет этот диалог.Это не требует никакого взаимодействия, кроме как для них, чтобы закрыть окно.Когда я сейчас запускаю эту функцию на своем листе, отладчик работает без ошибок, но stacklogger говорит

«У вас нет разрешения на вызов showModelessDialog для onEdit (TestCode: 16)»


Я решил это и переименовал функцию, поскольку она могла конфликтовать с триггером события, который я должен был установить.Вот код, который у меня сейчас есть:
function onConf(e){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var row = r.getRow();
  var column = r.getColumn();
  //moving from the Form Responses 1 sheet to the Processed sheet
  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Processed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  }
  var ProOrd = HtmlService.createHtmlOutput(numColumns);
  SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}

Как и предполагалось, я уже получил эти данные (и это имеет смысл для меня. Я не вижу, как они перемещают данные без их захвата)).
Но здесь я попробовал:

var ProOrd = HtmlService.createHtmlOutput(target);
var ProOrd = HtmlService.createHtmlOutput(numColumns);
var ProOrd = HtmlService.createHtmlOutput(row);

При использовании target в сообщении появляется только «undefined».Используя numColumns в сообщении написано "7".При использовании строки в сообщении говорится «2».Даже я не вижу смысла использовать переменные "s" или "r".Итак, я попробовал это:

  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Processed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    var outPUT = s.getRange(row, 1, 1, numColumns);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  }
  var ProOrd = HtmlService.createHtmlOutput(outPUT);
  SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}

, но определение переменной outPUT таким способом также приводит к появлению сообщения «Undefined» в диалоговом окне.Убирайся.Где скрывается этот ряд информации?

Мне удалось добиться большего успеха!У меня есть этот код сейчас:

function onConf(e){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var row = r.getRow();
  var column = r.getColumn();
     //moving from the Form Responses 1 sheet to the Processed sheet
  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
    var numColumns = s.getLastColumn();
    var data = ss.getDataRange().getValues(); // added
    var targetSheet = ss.getSheetByName("Processed");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  }
  var ProOrd = HtmlService.createHtmlOutput(**data**);
  SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}

Я читал и пытался BOLDing новую строку кода для переменной data, и это вызов в HTML-код.Но, кажется, он только что добавил две звездочки до и после, я не вижу его жирным шрифтом в диалоговом окне.

Я действительно получаю массив данных в толкаемом диалоговом окне!Однако это ВСЕ строки на листе, а не одна, которая соответствует условию true.Включая «Ложные» отчеты по всем открытым строкам на листе.

Как я могу ограничить этот массив только теми данными, которые соответствуют условию?На самом деле это ДОЛЖНО быть только один ряд данных за один раз.Я прикрепил изображение.В то время на листе было 3 строки информации.Я щелкнул 3-й ряд ПРОЦЕСС ДАЛЕЕ, и он переместил этот ряд данных и выдвинул массив в диалог.Вы можете увидеть эту 3-ю строку данных (для моего Пирса Эрроу) в презентации и заметить на заднем плане, что она перемещена.Теперь он находится на другом листе, как и хотелось.

enter image description here

Я думал, что размещение переменной данных в коде, где я это сделал, будет захватывать массив данныхПОСЛЕ истинного состояния было признано.Очевидно, это не очень хорошо, но я учусь и настойчив.

Работали над этим практически все выходные и добились определенного прогресса, но пока не понимаем.Вот код, который у меня есть на данный момент:

function onConf(e){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var row = r.getRow();
  var column = r.getColumn();
     //moving from the Form Responses 1 sheet to the Processed sheet
  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
  var numColumns = s.getLastColumn();
  var targetSheet = ss.getSheetByName("Processed");
  var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);}
  var celldata=s.getRange(row, 1, 1, numColumns).getValues();
  var data=HtmlService.createHtmlOutput(celldata);
  SpreadsheetApp.getUi().showModelessDialog(data, 'Details have been archived to the Processed sheet')
}

Я выполнил этот тест первый раз, и он на самом деле сгенерировал вывод наполовину так, как я хочу.Я так взволнован!dialog with data

Но все последующие тесты не пройдены.
Предоставление только диалога с ложными ,,,,, в теле.

Далее я теперь получаю этоОшибка при попытке пройти функцию: Не удается найти метод getRange (число, число, число, (класс)).(строка 14, файл "TestCode") Уволить

Я не понимаю, почему тот же код работает для копирования строки данных в цель, но не для определения переменной, представляющей значения в этихЯчейки для представления в диалоге.

Я знаю, что я не совсем не в курсе.Если я заменю этот код:

var celldata=s.getRange(row, 1, 1, numColumns).getValues();

на этот код:

var celldata="heres some data to review";

, я получу сообщение, выдвинутое в диалоговое окно.

generic presentation

.... так близко ...Я так же попробовал этот код:

      var celldata=s.getSheetValues(row, 1, 1, numColumns);

Но получаю похожую ошибку при обходе кода: Не удается найти метод getSheetValues ​​(число, число, число, (класс)).(строка 14, файл "TestCode") Отклонить

Что я не понимаю в командах getSheetValues ​​и / или getRange.getValues?Они звучат так логично ...

1 Ответ

0 голосов
/ 01 апреля 2019

Для всех, кто может просмотреть этот код, теперь делает то, что я задумал с точки зрения вопроса.

function onConf(e){
  var ss = SpreadsheetApp.getActive();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  var row = r.getRow();
  var column = r.getColumn();
  if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
  var numColumns = s.getLastColumn();
  var celldata=s.getSheetValues(row, 2, 1, numColumns);
  var targetSheet = ss.getSheetByName("Processed");
  var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);}
  var data=HtmlService.createHtmlOutput(celldata);
  SpreadsheetApp.getUi().showModelessDialog(data, 'Details have been archived to the Processed sheet')
}

Делает хорошее представление данных, хотя и нуждается в форматировании.Также перемещает линию, выбранную на другой лист.success Не могу дождаться появления 'cuda'.

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