如何将 Google 电子表格的特定工作表和 CSV 值保存在同一电子表格内另一工作表的单个单元格中?

时间:2021-03-04 18:06:44

标签: google-apps-script google-sheets

是否可以使用脚本将一张工作表的内容导出为逗号分隔值,并将这些逗号分隔值作为文本保存在同一电子表格中不同工作表的单元格中?

相反,是否可以使用脚本读取保存在一张纸上单个单元格中的逗号分隔值的内容,并在另一张纸上加载/查看它们的格式?

上下文:我有一张工作表(工作表 A),其中包含按行分隔的各种交易。我想使用第二张表(表 B)作为模板来记录有关这些交易的定性问题。单击按钮或菜单项,我想将该“日记条目”的内容保存到工作表 A 中的单个单元格中。此外,我想要工作表 B 或第三张工作表 (C)能够选择工作表 A 的任何给定行并以适当的格式加载日记帐分录。如果编辑和查看可以在同一张纸上完成(B)但不是绝对必要的,那就太好了

编辑

这是我正在处理的数据的 example sheet。完整代码的解决方案已在下方发布。

您可以在“日志”表中看到,创建的按钮用于:

(1) 加载日志模板 - 根据“模板”表,这将重置第 11 行下方的信息

(2) 加载日志条目 - 从所选交易的单个单元格加载逗号分隔值 (csv)

(3) 保存日志条目 - 这会将以下日志区域子集中的值保存为“选择交易”选择的交易的单个单元格

很想听听您的想法!

2 个答案:

答案 0 :(得分:0)

如果内容很小,我认为您不需要此操作的脚本。 当您谈到将工作表内容导出到单个单元格时,我想您可以使用 textjoin 公式将表格放入单元格中并用逗号分隔。

=textjoin(",";false;B1:C7) - 将 B1:C7 的内容放入您的单元格中。

展开它,你可以使用SPLIT公式

=split(B11;",")

从 B11 的内容中生成一行值

 = transpose(split(B11;","))

使它成为一种可能。

如果范围更大,您仍然可以在不使用单个脚本的情况下折叠和展开它们。但首先我得看看一些数据结构。

答案 1 :(得分:0)

这是我设法整合的解决方案。以下是原始问题中“编辑”下方描述的每个过程的代码:

(0) 一般声明

const ss = SpreadsheetApp.openById('###');
let log = ss.getSheetByName("Log");
let journal = ss.getSheetByName("Journal");
let logData = log.getDataRange().getValues();
let ticker = journal.getRange("A7").getValue();
let pnL = journal.getRange("H7").getValue();
let num = journal.getRange("B7").getValue();
let templates = ss.getSheetByName("Templates");

(1) 加载日志模板:

function loadTemplates() {
  // Clear current journal content and formatting
  journal.getRange("12:100").clearContent();
  journal.getRange("12:100").clearFormat();
  journal.getRange("12:100").setDataValidation(null);

  // Load Templates
  // ABCD
  if(journal.getRange("A3").getValue() == "ABCD"){
    templates.getRange("2:61").copyTo(journal.getRange("12:71"));
  // OTHER
  } else if (ss.getSheetByName("Journal").getRange("A3").getValue() == "ORB"){
    templates.getRange("63:122").copyTo(journal.getRange("12:71"));
  };
};

(2) 加载日志

function loadJournal() {
  for(let i = 0; i < logData.length; i++){
    if(logData[i][5].toString().includes(ticker) && logData[i][22] === num){
      journal.getRange("D13:G80").setValues(Utilities.parseCsv(logData[i][23]));
    };
  };
};

(3) 保存日记

function saveJournal() {
  // Declaring the range that will make up the Array
  let journalData = journal.getRange("D13:G80").getValues();
  let output = [];
  journalData.forEach(function(dataArray) {
      let data = dataArray.join(",");
      output += data + "\r\n";
  });
  // Finding correct trade to edit  
  for(let i = 0; i < logData.length; i++){
    if(logData[i][5].toString().includes(ticker) && logData[i][22] === num){
      log.getRange(i+1,24).setValue(output);
      //Resize workaround using Google Sheets API bc setWrap and setRowHeight do not work 
      const requests = {updateDimensionProperties: {
        properties: {pixelSize: 21},
        range: {sheetId: log.getSheetId(), startIndex: i+1, endIndex: i+1, dimension: "ROWS"},
        fields: "pixelSize"
      }};
      Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
    };  
  };
};

很想听听您的想法!