Выполнение анализа Монте-Карло в Google Spreadsheets - PullRequest
0 голосов
/ 03 мая 2018

Сложная Google Spreadsheet имеет много входов и один выход, и мне нужно провести анализ MonteCarlo на нем. В Excel я бы использовал подход "DYI" MonteCarlo, поставив формулы типа

=norminv(rand(),expected_return,st_deviation)

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

В таблицах Google я не могу найти способ перерасчета таблицы из сценариев приложений Google.

Есть ли какой-либо способ или лучшая / более умная архитектура для анализа MonteCarlo в электронных таблицах Google (желательно без использования надстроек, если я не понимаю, что они делают с данными, или требуется неограниченный доступ ко всем моим файлы)?

Заранее спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Это, кажется, делает трюк (из этой ссылки )

/**
 * @OnlyCurrentDoc  Limits the script to only accessing the current spreadsheet.
 */


/**
 * Adds a custom menu with items to show the sidebar and dialog.
 *
 * @param {Object} e The event parameter for a simple onOpen trigger.
 */
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createAddonMenu()
      .addItem('Re-calculate selected cells', 'recalculate')
      .addToUi();
}


/**
 * Force Spreadsheet to re-calculate selected cells
 */
function recalculate(){
  var activeRange = SpreadsheetApp.getActiveRange();
  var originalFormulas = activeRange.getFormulas();
  var originalValues = activeRange.getValues();

  var valuesToEraseFormula = [];
  var valuesToRestoreFormula = [];

  originalFormulas.forEach(function(outerVal, outerIdx){
    valuesToEraseFormula[outerIdx] = [];
    valuesToRestoreFormula[outerIdx] = [];
    outerVal.forEach(function(innerVal, innerIdx){
      if('' === innerVal){
        //The cell doesn't have formula
        valuesToEraseFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
        valuesToRestoreFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
      }else{
        //The cell has a formula.
        valuesToEraseFormula[outerIdx][innerIdx] = '';
        valuesToRestoreFormula[outerIdx][innerIdx] = originalFormulas[outerIdx][innerIdx];
      }
    })
  })

  activeRange.setValues(valuesToEraseFormula);
  activeRange.setValues(valuesToRestoreFormula);
}


/**
 * Runs when the add-on is installed; calls onOpen() to ensure menu creation and
 * any other initializion work is done immediately.
 *
 * @param {Object} e The event parameter for a simple onInstall trigger.
 */
function onInstall(e) {
  onOpen(e);
}
...