-1

我正在尝试从以下内容扩展脚本:“教程:使用 JavaScript 对象编写电子表格数据” https://developers.google.com/apps-script/articles/writing_spreadsheet_data

我已经在我们自己的电子表格中实现了这个脚本,并且能够读取我们的源电子表格并写入目标电子表格。不幸的是,我已经达到了该教程的极限,这恰好与我对 javascript 的了解程度不谋而合。

我们的目标: 1) 我们不需要将数据写入与教程中使用的“部门”匹配的工作表,而是需要使用与部门匹配的工作表写入特定的目标电子表格。2)我们需要循环脚本以将每个部门写入唯一的电子表格。

出于我们的目的,我们有大约 100 个“部门”,我们正在寻找的结果应该是 100 个电子表格 - 每个部门 1 个 [就像在教程中创建的工作表一样] 脚本不需要动态创建新的电子表格,虽然那很酷......我们只需要将它写入适当的电子表格。

非常感谢任何帮助/建议或方向。谢谢

4

2 回答 2

0

所以我是 Javascript、谷歌表格和这个网站的新手。但我想我会分享一些你可能会感兴趣的东西。这是我制作的一个脚本,用于根据月份将数据从工作表移动到各种目标工作表中。

它的工作原理是逐个遍历targetSheetNames,查看某个数据的月份值是否与数组中工作表名称的索引号匹配。

所以在这种情况下,数组从 0-11 开始,这很方便,因为 Javascript 中的月份也是 0-11。

出于您的目的,您可能需要添加更多位,以检查它是否是正确的数据等。但它为您提供了一个在同一个电子表格中将数据移动到多个工作表的示例。

function splitByMonth(){

  var targetSheetNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; // Sheet names, in month order. Order is important. Name is not. Sheets must exist. This will not create them.
  var sourceSheet = "Archive"; // Name of sheet with data in it.
   var dateColumn = 1; // Column number with date in it. A = 1, B = 2, C = 3, etc

  var ss, sheet, values, valuesLength, counter, archive = [];


  for (var i = 0; i < targetSheetNames.length; i++){

 ss = SpreadsheetApp.getActiveSpreadsheet();
 sheet = ss.getSheetByName(sourceSheet);
 values = sheet.getDataRange().getValues();
 valuesLength = values.length;
 counter = 1; // This starts at one because it assumes a header row.
 archive = [];

  while (counter < values.length){


    var d = new Date(values[counter][dateColumn - 1]);
    var m = d.getMonth();

    if (m == i  ){

      archive.push(values.splice(counter, 1)[0]); 
    }

    else

    {     
      counter++;
    }

  }  

  var archiveLength = archive.length;
  if (!archiveLength) {continue;}
  var dataSs = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = dataSs.getSheetByName(sourceSheetKeys[i]);
  var lastRow = targetSheet.getLastRow();
  var requiredRows = lastRow + archiveLength - targetSheet.getMaxRows();
  if (requiredRows > 0) targetSheet.insertRowsAfter(lastRow, requiredRows);
  targetSheet.getRange(lastRow + 1, 1, archiveLength, archive[0].length).setValues(archive);
 }

}
于 2014-02-07T16:50:11.537 回答
0

您需要在某处存储的是从部门名称到电子表格 ID 的映射。这可以通过在包含该映射的主电子表格中创建一个特殊工作表来完成:

Department     Spreadsheet Id
Sales          123
HR             456

当您准备好写出数据时,您可以查找给定部门的电子表格 ID。您可以使用SpreadsheetApp.openById()打开电子表格并向其写入数据。

于 2012-05-21T19:18:01.943 回答