伙計們,美好的一天!我有這些代碼,我想將其合并為一個,但很難做到。
這是將資料從源作業表復制到目標作業表的第一個代碼,添加到帶有資料的最后一行之后
function DE() {
let spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); // activates the opened document
let sourceSheet = spreadSheet.getSheetByName('Support Sheet'); // selects the sheet where the data will be coming from
let sourceSheet2 = spreadSheet.getSheetByName('Data Entry'); // selects the sheet where the sheet name contains
let sourceRange = sourceSheet.getDataRange();
let sourceRange2 = sourceSheet2.getDataRange();
let sourceValues = sourceRange.getValues();
let sourceValues2 = sourceRange2.getValues();
let sheetName = sourceValues2[1][1];
sourceValues = sourceValues.slice(1).map(row => row.slice(13,13 10));
let rowCount = sourceValues.length;
let columnCount = sourceValues[0].length;
let targetSheet = spreadSheet.getSheetByName(sheetName);
let lastRow = targetSheet.getLastRow() 1;
let targetRange = targetSheet.getRange(lastRow,1,rowCount,columnCount);
targetRange.setValues(sourceValues);
}
這是我在這里看到的代碼,它在我的電子表格中完美運行,如果基于唯一 ID(A 列)發生更改,則此代碼會更新 B 列
function updateEntrees() {
var ss=SpreadsheetApp.getActive();
var sh1=ss.getSheetByName('Support Sheet');
var rg1a=sh1.getRange(2,1,sh1.getLastRow()-1,1);
var vA1a=rg1a.getValues();
var rg1b=sh1.getRange(2,2,sh1.getLastRow()-1,1);
var vA1b=rg1b.getValues();
var sh2=ss.getSheetByName('Target Sheet');
var rg2a=sh2.getRange(2,1,sh2.getLastRow()-1,1);
var vA2a=rg2a.getValues();
var rg2b=sh2.getRange(2,2,sh2.getLastRow()-1,1);
var vA2b=rg2b.getValues();
for(var i=0;i<vA1a.length;i ) {
for(var j=0;j<vA2a.length;j ) {
if(vA1a[i][0]==vA2a[j][0]) {
vA2b[j][0]=vA1b[i][0]
}
}
}
rg2b.setValues(vA2b);
}
現在我想知道如何組合這 2 個,如果源作業表具有需要更新的唯一 ID,它將更新目標作業表,如果有新的唯一 ID,它只會在底部添加資料
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您有 2 張源作業表和目標作業表。
- 您希望通過檢查兩個作業表的“A”列來更新源作業表中的值并將其附加到目標作業表。
在這種情況下,以下修改后的腳本如何?
修改后的腳本:
function myFunction() {
// 1. Retrieve values from the source and target sheets.
var ss = SpreadsheetApp.getActive();
var [srcSheet, targetSheet] = ['Support Sheet', 'Target Sheet'].map(s => ss.getSheetByName(s));
var [srcValues, targetValues] = [srcSheet, targetSheet].map(s => s.getLastRow() == 1 ? [] : s.getRange("A2:B" s.getLastRow()).getValues());
// 2. Create objects for searching values of the column "A".
var [srcObj, targetObj] = [srcValues, targetValues].map(e => e.reduce((o, [a, b]) => (o[a] = b, o), {}));
// 3. Check update values at the target sheet.
var updatedValues = targetValues.map(([a, b]) => [a, (srcObj[a] || (b || ""))]);
// 4. Check append values.
var appendValues = srcValues.reduce((ar, [a, b]) => {
if (!targetObj[a]) ar.push([a, b]);
return ar;
}, []);
// 5. Update the target sheet.
var values = [...updatedValues, ...appendValues];
targetSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
- 在您的腳本中,此示例腳本假設兩張作業表的第一行是標題行。請注意這一點。
筆記:
- 我通過從您的腳本和問題中猜測您的電子表格來提出上述腳本。如果此腳本對您的情況沒有用處,您能否提供示例電子表格?借此,我想確認一下。
參考:
- 降低()
- 地圖()
添加:
從以下回復來看,
這作業正常,但添加到目標作業表的資料只是 A 列和 B 列,這是示例作業表:docs.google.com/spreadsheets/d/... 其中從需要轉移到目標作業表的源作業表的范圍是 N:X
下面的示例腳本怎么樣?
修改后的腳本:
function myFunction() {
// 1. Retrieve values from the source and target sheets.
var ss = SpreadsheetApp.getActive();
var [srcSheet, targetSheet] = ['Source Sheet', 'Target Sheet'].map(s => ss.getSheetByName(s));
var [srcValues, targetValues] = [[srcSheet, "N2:X"], [targetSheet, "A2:K"]].map(s => s[0].getLastRow() == 1 ? [] : s[0].getRange(s[1] s[0].getLastRow()).getValues());
// 2. Create objects for searching values of the column "A".
var [srcObj, targetObj] = [srcValues, targetValues].map(e => e.reduce((o, [a, ...b]) => (o[a] = b, o), {}));
// 3. Check update values at the target sheet.
var updatedValues = targetValues.map(([a, ...b]) => [a, ...(srcObj[a] || b)]);
// 4. Check append values.
var appendValues = srcValues.reduce((ar, [a, ...b]) => {
if (!targetObj[a]) ar.push([a, ...b]);
return ar;
}, []);
// 5. Update the target sheet.
var values = [...updatedValues, ...appendValues];
targetSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359488.html
上一篇:從JSPromise計算值
