0

У меня огромный объем разреженных матричных данных, где я хочу программно установить активную ячейку, где есть (0), когда я запускаю приведенный ниже фрагмент (функция).Установка setActiveSelection, где есть нуль

Что бы облегчить мне для манипуляций с кодом этикетки

Данные является чисто случайным. Процесс должен начинаться с текущей активной ячейки, и он должен снова зацикливаться от начала, если конец данных будет найден.

я получить неожиданные результаты,

function getzero() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getDataRange(); 
    var Values = range.getValues(); 

    for (var i = 0; i < Values.length; i++) { 
     for (var j = 0; j < Values[i].length; j++) { 
      if (Values[i][j] == 0) { 
       sheet.setActiveSelection(sheet.getRange(i + 1, j + 1)); 
       break; 
      } 
     } 
    } 
} 

sparse matrix

ответ

1

Это должно заботиться о нахождении всех нулей. Также добавлено меню для непосредственного запуска команды из листов. Просто вставьте код в редактор сценария и перезагрузите лист.

// This function addes a menu Zero and submenu getzero to access your function directly from spreadsheet 
function onOpen(){ 
var ss = SpreadsheetApp.getActive() 
var menu = [{name:"Find Zero",functionName: "getzero"}] 
    ss.addMenu("Zeroes", menu) 

} 



function getzero() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getDataRange(); 
    var Values = range.getValues(); 
    var selectedRange = sheet.getActiveRange() 
    // find active cells row and column 
    var startRow = selectedRange.getRow() -1 
    var startCol = selectedRange.getColumn() 
    var notFoundZero = true 

    //Use the active cells row and column to start the loop 
    for (var i = startRow; i < Values.length; i++) { 
     if (i == startRow){ 
     var j = startCol 
     } 
     else { 
     j =0 
     } 

     for (j ; j < Values[i].length; j++) { 
      // Using "===" makes sure the type is also match else blank is considered as zero too. 
      if (Values[i][j] === 0) { 
       Logger.log("Values Row X Col:" + i + " X " + j) 
       //The below line works as well as sheet.setActiveSelection 
       sheet.getRange(i + 1, j + 1).activate() 
       //Below code escapes the outer loop 
       i = Values.length; 
       // this boolean is used to runs or stops the next loop 
       notFoundZero = false; 
       // breaks inner loop 
       break; 
      } 
     } 
    } 

    if(notFoundZero){ 
    for (var i = 0; i <= startRow; i++) { 
     if (i == startRow){ 
     var runTill = startCol 
     } 
     else { 
     runTill = Values[i].length 
     } 

     for (var j=0 ; j < runTill; j++) { 
      if (Values[i][j] === 0) { 

       sheet.getRange(i + 1, j + 1).activate() 
       // same as above 
       i = Values.length; 
       //Used to alert if no more zeros found 
       notFoundZero = false; 
       break; 
      } 
     } 
    } 
    } 

    if(notFoundZero) 
    { 
    var ui = SpreadsheetApp.getUi() 
    ui.alert("No More zero Found") 

    } 


} 

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

Дайте мне понять, как это происходит.

Edit: Ниже код для поиска в обратном направлении

Ниже кодекс не был проверен, Может есть ошибки. Это был не основной вопрос, поэтому он не проверял наличие ошибок.

function getzeroRev() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getDataRange(); 
    var Values = range.getValues(); 
    var selectedRange = sheet.getActiveRange() 
    // find active cells row and column 
    var startRow = selectedRange.getRow() -1 
    var startCol = selectedRange.getColumn() 
    var notFoundZero = true 

    //Use the active cells row and column to start the loop 

    for (var i = startRow; i >=0; i--) { 
     if (i == startRow){ 
     var j = startCol 
     } 
     else { 
     j =values[i].length 
     } 

     for (j ; j >=0; j--) { 
      // Using "===" makes sure the type is also match else blank is considered as zero too. 
      if (Values[i][j] === 0) { 
       Logger.log("Values Row X Col:" + i + " X " + j) 
       //The below line works as well as sheet.setActiveSelection 
       sheet.getRange(i + 1, j + 1).activate() 
       //Below code escapes the outer loop 
       i = Values.length; 
       // this boolean is used to runs or stops the next loop 
       notFoundZero = false; 
       // breaks inner loop 
       break; 
      } 
     } 
    } 

    if(notFoundZero){ 
    for (var i = values.length; i >= startRow; i--) { 
     if (i == startRow){ 
     var runTill = startCol 
     } 
     else { 
     runTill = 0 
     } 

     for (var j=0 ; j >= runTill; j--) { 
      if (Values[i][j] === 0) { 

       sheet.getRange(i + 1, j + 1).activate() 
       // same as above 
       i = Values.length; 
       //Used to alert if no more zeros found 
       notFoundZero = false; 
       break; 
      } 
     } 
    } 
    } 

    if(notFoundZero) 
    { 
    var ui = SpreadsheetApp.getUi() 
    ui.alert("No More zero Found") 

    } 


} 
+0

Спасибо джагана - это работает удивительным, любые улучшения производительности будет оценены, как и у меня есть большой объем (во многих листах), как я описал –

+0

Какова Ваша конечная цель здесь? Что вы делаете после активации ячейки с нулем? –

+0

Конечная цель - мне присваивается лист с определенными значениями (координатами) и адресом ячейки, если 0 найден в указанном адресе ячейки, я должен удалить нуль вручную и вставить координаты. Данные координаты (печатная версия). Можете ли вы рассказать мне об изменениях, которые мне нужно сделать для движения назад - когда-то курсор идет где-то в порядке. (вы можете просто проинструктировать меня, я постараюсь сделать это сам). –

 Смежные вопросы

  • Нет связанных вопросов^_^