簡體   English   中英

indexOf 在依賴於父函數(Google Apps 腳本)的變量(數組)的 Map 函數中運行

[英]indexOf running within Map function relying on Variable (array) from parent function (Google Apps Script)

我是 Google Apps Script/Javascript 的新手,我正在對我的原始代碼進行第二次迭代以使其更快。 我的第一個代碼對底層的 Google Sheet 進行了大量的獲取和設置,而現在我正在嘗試在設置修改后的值之前在數組中執行所有操作。 我當前遇到的代碼塊是我嘗試在運行 map 函數時運行 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  
  })
}

會計代碼變量依賴於根據數組列之一中的值執行了 Javascript 版本的 vlookup。 查找值存在於從工作表中的不同選項卡拉出的另一個數組中。 我知道執行查找的代碼如下所示:

  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]

上面代碼中的公式依賴於在 map 函數開始運行之前在父函數中創建的codeMappingData變量。

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

問題:如何map 函數中引用codeMappingData數組?

解決此問題的其他選擇是運行與地圖分開的 For 循環,但是在嘗試了解所有可能性時,我一直在嘗試了解如何傳遞變量並實現所有列操作盡可能少的代碼。 關於如何實現變量傳遞的任何指導,或關於如何提高代碼效率的提示,都將非常有價值。 我只復制了一些代碼,所以它可能缺乏上下文,但我認為問題很清楚。

請注意,我假設在 Map 函數中建立 codeMappingData 變量是不明智的,因為每次它遍歷一行時,它都會從工作表中執行獲取? 如果我的假設不正確,那么最簡單的方法可能是在地圖中建立變量。

謝謝,

內部或子作用域始終可以訪問外部或父作用域中的變量。

 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();

參考:

您可以使用Array.prototype.map() 文檔中所述的thisArg參數。 只需在關閉大括號后添加它,並在 map 函數codeMappingData其稱為this ,而不是codeMappingData

var timeTrackingCodeRow = codeMappingData.map(function(r) {
  Logger.log(this[0]); // logs the first element of codeMappingData
  return r[0];
}, codeMappingData).indexOf(timeTrackingCode);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM