【问题标题】:Inserting variable data into an existing Google Sheet in Google Scripts在 Google Scripts 中将可变数据插入现有的 Google Sheet
【发布时间】:2019-12-21 23:04:17
【问题描述】:

我正在构建一个脚本,该脚本最终将从 csv 文件中获取数据,填充电子表格,使用该电子表格自动填充大量文档,然后自动将这些文档通过电子邮件发送给客户。它还将每次脚本运行时的文档移动到仅包含当天报告的新文件夹中。我对 Google Scripts 很陌生,这是我的学习项目。

到目前为止,我必须执行的步骤是使用虚拟数据为电子表格创建文档。

我最终创建了第二个脚本来发送电子邮件,它发送电子邮件,但它被设置为在文件夹中查找所有属于谷歌文档的文档,因此它将每个文档的副本发送给每个客户.我认为如果我将电子邮件指向原始电子表格以获取正确的文档 ID(而不是类型),我只能向客户发送属于他们的报告(全部为 PDF 格式)。创建一个新文件夹并将文档移入其中的步骤工作正常。

我遇到的问题是将数据输入到原始电子表格的文档 ID 列中。我已经能够看到它将第一个文档的文档 ID 放入列中具有要迭代的信息的每一行,然后用第二个文档的 ID 再次替换每一行,等等。

我寻找将数据添加到电子表格的方法。到目前为止,我发现的每种方法都涉及使用电子表格中数据的新信息创建新列或行。我需要输入我刚刚在电子表格之外创建的数据,然后将其放在正确的位置,以便以后可以指向它。

我已经浏览了文档中的方法。看起来 .getCell.setvalue(variable) 应该可以工作...如果我能找到一种方法从范围中获取单元格(这一直显示我超出范围)。

function createDocument() {
var headers = Sheets.Spreadsheets.Values.get('17jXy9IlLt8C41tWEG5iQR31GjzOftlJs73y2L_0ZWNM', 'A1:P1');
var tactics = Sheets.Spreadsheets.Values.get('17jXy9IlLt8C41tWEG5iQR31GjzOftlJs73y2L_0ZWNM', 'A2:P');
var templateId = '1DU13OJHWyYnO5mLFovm97pWwXuU7ZTTDVJb2Mpdeebk';

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

var customer = tactics.values[i][0];
var pcname = tactics.values[i][1];
var date = tactics.values[i][2];
var virusvalue = tactics.values[i][3];
var cpuuse = tactics.values[i][4];
var ramuse = tactics.values[i][5];
var harddrive = tactics.values[i][6];
var netuse = tactics.values[i][7];
var downtime = tactics.values[i][8];
var cpuperform = tactics.values[i][9];
var ramperform = tactics.values[i][10];
var harddiskperform = tactics.values[i][11];
var reccomend = tactics.values[i][13];
var custID = tactics.values[i][14];
var newdoc = tactics.values[i][15];

//Make a copy of the template file
var documentID = DriveApp.getFileById(templateId).makeCopy(DriveApp.getFolderById('1zV-WpzUKoRurE9FnBcfjBygBA5rCO67I')).getId();

//rename the copied file
DriveApp.getFileById(documentID).setName('MCHA ' + customer + ' - ' + pcname);

Logger.log('value1 ' + documentID);

//THIS IS THE AREA I'M TRYING TO FIX
var ss = SpreadsheetApp.openById('113aqWVAjjUYCmI2oFc_BTbXkWMPFPjk_SschsKEx6qU');
var cell = ss.getRange('P2:P').getCell([i], [15]);
cell.setValue(documentID);
SpreadsheetApp.flush();

Logger.log('value2 ' + documentID);

 //This area has code to replace the tags in the document with values from the spreadsheet.  I cut it for not being relevant.        
  }
}

显然,定义范围只会填充和自动填充每个单元格。该代码在我尝试时有效

我最初尝试使用之前列表中的变量进行自动填充,但后来我意识到这根本不起作用。

我尝试设置单元格范围,然后使用相同的符号([i][15] 等)设置当前单元格,这会引发“未找到范围”错误。我觉得我一定是遗漏了一些语法。

如果有帮助,下面是指向包含所有文档的文件夹的链接。 https://drive.google.com/drive/folders/1sRhti3R8R-Cym0hr2S4XkAVn3wyBbSRu?usp=sharing

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我可能没有完全理解您所面临的问题。但我可以看到“找不到范围”错误的原因。

    您的循环以 0 的值为 i 开始。这会导致脚本在第一次迭代中查找名为 P0 的范围。

    避免这种情况的一种方法是尝试:

     var cell = ss.getRange("P"+(i+1));
    

    为了代码效率,我还建议将一些代码移到循环之外。例如,以下行在循环中每次运行。但它可以在循环外定义一次,然后变量ss 可以在循环内重复使用。

    var ss = SpreadsheetApp.openById('113aqWVAjjUYCmI2oFc_BTbXkWMPFPjk_SschsKEx6qU');
    

    类似地,你可以在循环外定义模板文件,然后在循环内调用它来制作副本:

    var templateFile = DriveApp.getFileById(templateId); // Outside the loop
    

    然后在循环内部:

    var documentID = templateFile.makeCopy(DriveApp.getFolderById('1zV-WpzUKoRurE9FnBcfjBygBA5rCO67I')).getId();
    

    Google 应用脚本最佳做法建议尽量减少对电子表格的调用,即一次调用获取数据、处理数据,然后一次调用将数据发布到工作表。 More here.

    希望这会有所帮助。

    【讨论】:

    • 做到了!我确实必须使它成为 i+2,因为我希望它从第 2 行开始,但它让我到了那里。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2021-12-10
    相关资源
    最近更新 更多