2016-11-11 2 views
1

Это очень просто для тех, кто знает, что они делают.Итерация по выбору диапазона

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

Любые подсказки о том, как я мог бы перебирать диапазон с помощью office.js?

Office.context.document.getSelectedDataAsync(Office.CoercionType.Text, 
    function (asyncResult) { 
     if (asyncResult.status === Office.AsyncResultStatus.Failed) { 
      console.log(asyncResult.error.message); 
     } else { 
      // write the result to range selection variable 
      var rsel = asyncResult.value; 
     }    


     Excel.run(function(context) { 
      // convert to string 
      context.workbook.getSelectedRange().format.fill.color = rsel.toString(); 
      return context.sync(); 
     }).catch(function(error) { 
      console.log(error); 
      if (error instanceof OfficeExtension.Error) { 
       console.log("Debug info: " + JSON.stringify(error.debugInfo)); 
      } 
     }); 
    } 
); 

ответ

2

Основано на вашем описании, похоже, что вы хотите что-то подобное?

enter image description here

Вот две функции, одна из которых просто записывает случайные шестнадцатеричные значения ячеек, и еще что на самом деле цвета им. Обратите внимание, что обычно лучше не смешивать синтаксис API ExcelApi 1.1 и Office 2013 getSelectedDataAsync в том же блоке кода, иначе шаблон обратного вызова и обещания может немного запутать, хотя у вас есть это прямо выше. Для моих примеров, хотя, я буду использовать только 1.1 синтаксис ExcelApi:

function setRandomValues() { 
    Excel.run(function (context) { 
     var selection = context.workbook.getSelectedRange(); 
     selection.format.fill.clear(); 
     selection.load("rowCount, columnCount"); 

     return context.sync() 
      .then(function() { 
       var valuesArray = []; 
       for (var r = 0; r < selection.rowCount; r++) { 
        var rowValues = []; 
        for (var c = 0; c < selection.columnCount; c++) { 
         rowValues.push(getRandomColor()); 
        } 
        valuesArray.push(rowValues); 
       } 
       selection.values = valuesArray; 
      }) 
      .then(context.sync); 

     function getRandomColor() { 
      // from http://stackoverflow.com/a/5092872/678505 
      return "#000000".replace(/0/g, function(){ 
       return (~~(Math.random()*16)).toString(16); 
      }); 
     } 
    }) 
    .catch(console.log) 
} 

И

function highlightSelection() { 
    Excel.run(function (context) { 
     var selection = context.workbook.getSelectedRange(); 
     selection.load("rowCount, columnCount, values"); 

     return context.sync() 
      .then(function() { 
       for (var r = 0; r < selection.rowCount; r++) { 
        for (var c = 0; c < selection.columnCount; c++) { 
         selection.getCell(r, c).format.fill.color = selection.values[r][c]; 
        } 
       } 
      }) 
      .then(context.sync); 
    }) 
    .catch(console.log); 
} 
+0

помадка! Я получаю недопустимую ошибку аргумента в коде, когда я копирую его в решение. Я слишком много неофитов, чтобы понять, как отлаживать, но я буду продолжать пытаться. Спасибо, Майкл! – Jeffrey

+0

Если вместо '.catch (console.log)' вы используете 'function (error) {console.log (ошибка); if (экземпляр ошибки OfficeExtension.error) {console.log (JSON.stringify (error.debugInfo))}} вы должны иметь возможность получить более подробную информацию об отладке для сбоя. –