簡體   English   中英

如果單元格包含公式; 然后,將公式復制到目標工作表,否則為值或空白,原樣

[英]If Cell Contains formula; then, Copy Formula to Destination Sheet else value or blank , As it is

我有一個腳本可以幫助將數據從源工作表(用戶窗體)復制到目標工作表(數據表),效果很好。 現在我需要一個額外的任務,如果 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

在您的情況下,以下修改如何?

從:

  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. 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. ,我了解到您只想將公式從源工作表轉移到目標工作表。

參考:

暫無
暫無

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

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