我有一個大約 2K 專案的谷歌表,每個專案都與幾筆金融交易相關聯。我已經閱讀了一些關于 SO 的sumif問題,但希望在改進我當前的腳本方面得到幫助(減少或簡化我添加的額外代碼行以使其作業),這是我基于@Mohammad Usman 對這個SO 問題的回答. 我喜歡他的回答,因為它在 < 三秒內執行 2K sumif計算,即使我添加了額外的步驟以使其在谷歌表格中對我有用。
下面是我的谷歌表格的示例(實際上,我將在“所需輸出”下有大約 2K 行:
INPUT
| 水果(Col A) | 數量(Col D) |
|---|---|
| 蘋果 | 5 |
| 梨 | 3 |
| 蘋果 | 4 |
| 葡萄 | 4 |
| 梨 | 5 |
DESIRED OUTPUT
| 水果 | 數量 |
|---|---|
| 蘋果 | 9 |
| 梨 | 8 |
| 葡萄 | 4 |
這是我當前帶有注釋的代碼的核心:
const a = wsSalesData.getRange(2, 1, 1762).getValues();
const b0 = wsSalesData.getRange(2, 4, 1762).getValues();
const b = b0.flat(1);//if I don't add this line, then the script reads the amounts in column 4 as text and won't sum based on "const a." In the SO Post, "[4, 2, 7, 6, 8, 9]" doesn't require flattening.
const sumObject = b.reduce((acc,e,i,arr) => {
acc[a[i]] = (acc[a[i]] || 0) e;
return acc;
}, {});
const sum = Object.entries(sumObject).map(el => [el[0] el[1]]);
let sourceArray = sum.map(row => [row[0].slice(0,6), row[0].slice(6)]);//needed to create two columns of data; otherwise, the product and the sum amount are in the same column.SO Post doesn't require this step.
任何想法如何:
- 修改 const sumObject 以消除源帖子中未包含的“const b”和“let source Array”
- 修改代碼以允許附加條件。例如,添加一個區域列,然后按區域和專案求和。
提前感謝您的任何改進。
uj5u.com熱心網友回復:
修改點:
在您顯示的示例電子表格影像中,“Fruit”和“Amouont Sold”的列似乎是“A”和“B”列。但是,當我看到你的腳本時,“水果”和“銷售額”的列似乎是“A”和“D”列。而且,不幸的是,我無法理解您期望的目標范圍和作業表。因此,在這個答案中,從您的示例電子表格影像中,它假設“INPUT”的“Fruit”和“Amouont Sold”列分別是“A”和“B”列。請注意這一點。
在您的腳本中
const sum = Object.entries(sumObject).map(el => [el[0] el[1]]);,我認為鍵和值已合并。這樣,在 處let sourceArray = sum.map(row => [row[0].slice(0,6), row[0].slice(6)]);,不顯示任何值。我認為這可能是您當前問題的原因。
當這些點反映在你的腳本中時,下面的修改怎么樣?
修改后的腳本:
function myFunction() {
const srcSheetName = "Sheet1"; // Please set your source sheet name.
const dstSheetName = "Sheet2"; // Please set your destination sheet name.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName(srcSheetName);
const dstSheet = ss.getSheetByName(dstSheetName);
const values = srcSheet.getRange(2, 1, srcSheet.getLastRow() - 1, 2).getValues();
const res = [...values.reduce((m, [a, b]) => m.set(a, m.has(a) ? m.get(a) b : b), new Map())];
dstSheet.getRange(1, 1, res.length, res[0].length).setValues(res);
}
- 運行此腳本時,將從源作業表的“A”和“B”列中檢索源值。并且,值被轉換并且轉換后的值被放入目標表中。
參考:
- 減少()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527151.html
