Почему моя проблема редактирования влияет на другие столбцы? - PullRequest
0 голосов
/ 14 декабря 2018

Ссылка на мой лист: https://docs.google.com/spreadsheets/d/1gkWCU0fHotORi-urOfuHjGGiqrnYcdtZQ9bZhm7XLIk/edit?usp=sharing

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

Как работает кнопка «Функции»:
Панель меню: Функция > Вставить новый столбец Вставить какстолько столбцов, сколько мне нужно, манипулируя сценарием.

Как работает мой сценарий AutoTimeStamp: Как только флажки установлены (столбец C), даты автоматически применяются к столбцу D.

Как работает мой скрипт «Копировать»: Как только Вставить новый столбец активируется, он создает копию столбцов C и D слева направо.Это также применяет функцию TimeStamp к каждому вновь созданному столбцу.

Функциональная кнопка :

Недавно созданные столбцы

Нажатие на чекбоксы и автоматическое определение даты успешно

Ошибка при удалении дат

Ошибка в последнем столбце

Здесь Вставить новый столбец Функция:

var ss = SpreadsheetApp.getActive();

function onOpen() {      
  var menu = [{name:"Insert New Columns", functionName:"addColumn"}];
  ss.addMenu("Functions", menu); 
}

function addColumn() {    
  var sh = ss.getActiveSheet(), lCol = sh.getLastColumn(); 
  var lRow = sh.getLastRow(), range = sh.getRange(1,lCol-1,lRow,2);
  sh.insertColumnsAfter(lCol,10);
  var newRange = sh.getRange(1,lCol+1,lRow,10);
  var columnWidths = SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS
  range.copyTo(newRange);
  range.copyTo(newRange,columnWidths,false);
  newRange.setFormulas(newRange.getFormulas());
}

Вот сценарий AutoTimeStamp :

var COLUMNTOCHECK = 3;
var DATETIMELOCATION = [0, 1];
var SHEETNAME = 'Training Dash'

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  if( sheet.getSheetName() == SHEETNAME ) { 
    var selectedCell = ss.getActiveCell();
    if( selectedCell.getColumn() >= COLUMNTOCHECK) { 
      var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[1]);
      dateTimeCell.setValue(new Date());
      }
  }
}

Это скрипт Copy рядом с некоторыми макросами.

function Copy() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2);
  spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate();
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn(), sheet.getMaxRows(), 1).activate();
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn() - 2, sheet.getMaxRows(), 2).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

function UntitledMacro() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2);
  spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate();
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn() - 2, sheet.getMaxRows(), 2).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn(), sheet.getMaxRows(), 2).activate();
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn() - 2, sheet.getMaxRows(), 2).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
};
function UntitledMacro1() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn(), sheet.getMaxRows(), 2).activate();
  spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 2);
  spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 2).activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet15'), true);
  spreadsheet.getCurrentCell().offset(-2, 0, 17, 2).activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Training Dash'), true);
  spreadsheet.getCurrentCell().activate();
  spreadsheet.getRange('Sheet15!A1:B17').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn(), sheet.getMaxRows(), 2).activate();
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, spreadsheet.getCurrentCell().getColumn() - 2, sheet.getMaxRows(), 2).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
};
function UntitledMacro2() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('E:N').activate();
  spreadsheet.getActiveSheet().insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 10);
  spreadsheet.getActiveRange().offset(0, 0, spreadsheet.getActiveRange().getNumRows(), 10).activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet15'), true);
  spreadsheet.getRange('A1:B17').activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Training Dash'), true);
  spreadsheet.getRange('E1:N1').activate();
  var currentCell = spreadsheet.getCurrentCell();
  spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
  currentCell.activateAsCurrentCell();
  spreadsheet.getRange('Sheet15!A1:B17').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('E:N').activate();
  spreadsheet.getRange('O1:P16').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet15'), true);
  spreadsheet.getActiveSheet().hideSheet();
};

1 Ответ

0 голосов
/ 15 декабря 2018

Проблема заключается в этой строке кода в OnEdit (e)

`if( selectedCell.getColumn() >= COLUMNTOCHECK) { `

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

Решение состоит в том, чтобы проверить, является ли столбецвыбранная ячейка является нечетным или четным числом.Номера столбцов, содержащие флажки, являются нечетными, номера столбцов, содержащие метки даты, являются четными.Итак, если номер столбца нечетный, то OnEdit должен работать как обычно, но если номер столбца четный, то OnEdit ничего не должен делать.

Тест на нечетность / четность выполняется с использованием модуля.См. подробное обсуждение .

Замените код проблемы на следующую строку:

` if (selectedCell.getColumn() >= COLUMNTOCHECK && selectedCell.getColumn() % 2 == 1) {`

Различия:
&&- означает «И» - код теперь оценивает два результата
selectedCell.getColumn() % 2 == 1 - результат 1 (один) идентифицирует нечетное число.

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