我有一個腳本可以幫助將資料從源作業表(用戶表單)復制到目標作業表(資料表),效果很好。現在我需要一個額外的任務,如果 E12 到 E22 有公式或值,則照原樣復制。現在它只有價值但沒有公式,我需要兩者。例如。E15 = C15*D15 和 E16 = 30,我需要復制公式和值。請使用以下腳本進行指導
function submitdata() {
const dstSpreadsheetId = "1QL0jaNts2YRkZTlxmS0bk7V1fVVHBsJFmxS5C05PEmA"; // Please set the destination Spreadsheet ID (WB-DataSheet_B).
const dstSheetName = "DataSheet";
const srcSheetName = "UserForm";
// Retrieve values from source sheet and create an array and search value.
const srcSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const ranges = ["C3", "C7", "C8", "D8", "D6", "D4", "E8", "E19", "E20", "E21", "E22", "B10", "C10", "D10", "E10", "B11", "C11", "D11", "E11", "B12", "C12", "D12", "E12", "B13", "C13", "D13", "E13", "B14", "C14", "D14", "E14", "B15", "C15", "D15", "E15", "B16", "C16", "D16", "E16", "B17", "C17", "D17", "E17", "B18", "C18", "D18", "E18", "B19", "C19", "B20", "C20", "B21", "C21", "B22", "C22","D19", "D20", "D21", "D22"];
const [search, ...values] = Sheets.Spreadsheets.Values.batchGet(srcSpreadsheet.getId(),{ ranges: ranges.map(r => `'${srcSheetName}'!${r}`) }).valueRanges.flatMap(({ values, range }) => {
if (range.includes("B10:E18")) return values ? values.flat() : [];
if (range.includes("B19:D22")) return values ? values.flat() : [];
return values ? values[0][0] : "";
});
if (!search) return;
// Put the array to the destination sheet using the search value.
const dstSheet = SpreadsheetApp.openById(dstSpreadsheetId).getSheetByName(dstSheetName);
const range = dstSheet.getRange("A2:A" dstSheet.getLastRow()).createTextFinder(search).findNext();
if (range) {
dstSheet.getRange(range.getRow(), 2, 1, values.length).setValues([values]);
} else {
dstSheet.getRange(dstSheet.getLastRow() 1, 1, 1, values.length 1).setValues([[search, ...values]]);
}
}
還共享了兩個包含實際資料的電子表格(用戶表單和資料表)供您參考https://docs.google.com/spreadsheets/d/1NY_ckzEWxU7DCGro5tTqzpiOi6iG5PAQFxpZg0OKodY/edit?usp=sharing
https://docs.google.com/spreadsheets/d/1QL0jaNts2YRkZTlxmS0bk7V1fVVHBsJFmxS5C05PEmA/edit?usp=sharing
uj5u.com熱心網友回復:
在您的情況下,如何進行以下修改?
從:
const [search, ...values] = Sheets.Spreadsheets.Values.batchGet(srcSpreadsheet.getId(),{ ranges: ranges.map(r => `'${srcSheetName}'!${r}`) }).valueRanges.flatMap(({ values, range }) => {
if (range.includes("B10:E18")) return values ? values.flat() : [];
if (range.includes("B19:D22")) return values ? values.flat() : [];
return values ? values[0][0] : "";
});
到:
const [search, ...values] = Sheets.Spreadsheets.Values.batchGet(srcSpreadsheet.getId(), { ranges: ranges.map(r => `'${srcSheetName}'!${r}`), valueRenderOption: "FORMULA" }).valueRanges.flatMap(({ values, range }) => {
if (range.includes("B10:E18")) return values ? values.flat() : [];
if (range.includes("B19:D22")) return values ? values.flat() : [];
return values ? values[0][0] : "";
});
- 在此修改中,
valueRenderOption: "FORMULA"添加了。這樣,當單元格有公式時,可以檢索公式而不是顯示值。
筆記:
- 順便說一句,作為附加資訊,在您的情況下,例如,當源作業表的“E22”具有公式時
=SUM(E19:E21),檢索到的公式為=SUM(E19:E21)。因此,當將其放入目標作業表的單元格時,將使用此公式。在這種情況下,我認為公式的結果值與源表的結果值不同。因為源作業表和目標作業表的作業表標準不同。如果要更改目標表的這個公式,我認為腳本會很復雜。請注意這一點。- 從您的問題中
Now I need an additional task that if E12 to E22 has formula or value, copy as it is. now it gets only value but not formula, I need both. eg. E15 = C15*D15 and E16 = 30, I need to copy both formula and value.,我了解到您只是想要從源表到目標表的公式。
- 從您的問題中
參考:
- 方法:電子表格.values.batchGet
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441621.html
