indexOf работает внутри функции Map, полагаясь на переменную (массив) из родительской функции (Google Apps Script) - PullRequest
1 голос
/ 19 февраля 2020

Я новичок в Google Apps Script / Javascript и занимаюсь второй итерацией моего исходного кода, чтобы сделать его быстрее. В моем первом коде было много операций получения и установки базового Google Sheet, а сейчас я пытаюсь сделать все в массивах, прежде чем устанавливать пересмотренные значения. Текущий блок кода, на котором я застрял, - это моя попытка запустить indexOf при запуске функции карты.

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

var = amendedTimesheetData = timesheetdata.map(function(item){
    item.splice(2, 0, item[0] + " " + item[1]);
    item.splice(4, 0, item[0].slice(0, 2) + item[1].slice(0, 2) + date(item[3]));
    item.splice(0, 2);
    item.splice(3, 0, "Open");
    item.splice(4, 0, accountingCode); //SEE ISSUE BELOW

    return item  
  })
}

Переменная учетного кода зависит от выполнения версии vlookup Javascript на основе значения в одном из столбцов массива. Найденное значение существует в другом массиве , извлеченном из другой вкладки на листе. Я знаю, что код для выполнения поиска выглядит следующим образом:

  var timeTrackingCode = item[6]; //this is the location in the mapped array of the value to be looked up
  var timeTrackingCodeRow = codeMappingData.map(function(r){ return r[0]; }).indexOf(timeTrackingCode);
  var accountingCode = codeMappingData[timeTrackingCodeRow][1]

Формула в приведенном выше коде основана на переменной codeMappingData , которая была сделана ранее в родительской функции перед функцией map запустился.

  var codeMappingSheet = ss.getSheetByName('CodeMapping');
  var codeMappingRange = codeMappingSheet.getDataRange();
  var codeMappingData = codeMappingRange.getValues();

Вопрос: Как мне ссылаться на массив codeMappingData , тогда как в функция карты?

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

Обратите внимание, что я предположил, что было бы неуместно устанавливать sh Переменная codeMappingData внутри функции Map, потому что тогда каждый раз, когда она выполняет итерацию по строке, она будет выполнять извлечение из листа? Если я ошибаюсь, предполагая это, то, возможно, самый простой подход - установить sh переменную на карте.

Спасибо,

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

function outerFunction(){
  const outerScopeVar = 5;
  const arr = [1,2,3];
  arr.map(num => {
    console.info(`I have access to both inner and outer scope variable: ${num} and ${outerScopeVar}`);
  })
}
outerFunction();

Ссылки:

0 голосов
/ 19 февраля 2020

Вы можете использовать параметр thisArg, как описано в документации Array.prototype.map () . Просто добавьте его после закрывающей фигурной скобки и обозначьте его как this в функции карты, а не codeMappingData.

var timeTrackingCodeRow = codeMappingData.map(function(r) {
  Logger.log(this[0]); // logs the first element of codeMappingData
  return r[0];
}, codeMappingData).indexOf(timeTrackingCode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...