arrays - 谷歌应用程序脚本邮件合并不提取arrayformula结果
问题描述
当谈到谷歌脚本时,我是一个新手。我在网上找到了一些代码,它从谷歌工作表的当前行(从表单派生)中获取信息并将其放入谷歌文档(有点像邮件合并,但只针对当前行)。我已经对其进行了调整以适应我的需要。
这就是发生的事情。用户完成链接到工作表的表单。使用 arrayformula 在工作表上进行了许多计算,以为文档提供附加信息。无论用户在哪一行点击我创建的按钮,该行的信息都会传输到模板文档中。
这适用于第一行(第 2 行,其中第 1 行是标题行),但是当我尝试为第 3 行运行它时,工作表中唯一传输的信息是非数组公式信息,即输入到表单中的信息不是计算出来的信息!
谁能给我一些关于为什么以及是否有解决方案的见解?
这是使用的代码的副本:
var employee_ID = "";
var SOURCE_TEMPLATE = "1roWDiQ8NuMF06thK-bim0iwmX1_mbjvvcNIDAxfZZlI";
var employee_SPREADSHEET = "1sFWhuN_nSVEWvuPjWz2gKPdDSKw8DJBe8uoapItC0G4";
var TARGET_FOLDER = "1teL41C9NM0O5ma_2BUNe-MMX0rkSiA4h";
function getCurrentRow() {
var currentRow =
SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
return currentRow;
}
function getRowAsArray(sheet, row) {
var dataRange = sheet.getRange(row, 1, 1, 99);
var data = dataRange.getValues();
var columns = [];
for (i in data) {
var row = data[i];
Logger.log("Got row", row);
for(var l=0; l<99; l++) {
var col = row[l];
if(!col) {
break;
}
columns.push(col);
}
}
return columns;
}
function createDuplicateDocument(sourceId, name) {
var source = DriveApp.getFileById(sourceId);
var targetFolder = DriveApp.getFolderById(TARGET_FOLDER);
var newFile = source.makeCopy(name, targetFolder);
return DocumentApp.openById(newFile.getId());
}
function generateEmployeeDatasheet() {
var data = SpreadsheetApp.openById(employee_SPREADSHEET);
if(!employee_ID) {
employee_ID = getCurrentRow();
if (employee_ID == 1) {
var employee_ID = Browser.msgBox("You need your cursor to be on the
row within which you are working ", Browser.Buttons.OK);
}
}
var sheet = data.getSheets()[1];
var columns = getRowAsArray(sheet, 1);
Logger.log("Processing columns:" + columns);
var row = getRowAsArray(sheet, employee_ID);
Logger.log("Processing data:" + row);
var employeeName = row[2];
var timeStamp = row[0];
var employeeDate = row[51];
var target = createDuplicateDocument(SOURCE_TEMPLATE, employeeName + "
Final Pay Letter " + employeeDate);
Logger.log("Created new document:" + target.getId());
for(var i=0; i<columns.length; i++) {
var body = target.getActiveSection();
body.replaceText("<<Name>>",row[2]); //col C
body.replaceText("<<Final pay period>>",row[4]); //col E
body.replaceText("<<Training details1>>",row[9]); //col J
}
}
更新 04/10/18 看来我的问题存在于 getRowsArray 函数中,特别是:
if(!col) {
break;
}
如果我的电子表格数据中有一个空条目,则函数会中断,因此不会捕获电子表格行中的数据。
有谁现在如何改变这个,所以这个函数以另一种方式识别行中的最后一列?
解决方案
这是我获取包含给定列中数据的最后一行的实用工具。两行 - 100% 的时间工作。
var Avals = ss.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
Logger.log("The last row of data is "+Alast);
信用:“确定单列中的最后一行”
推荐阅读
- list - Roblox Studio - 工作区。(我的 roblox ign)。名称:8:尝试使用“DisplayName”索引 nil
- python - 嵌套列表黑客等级测试用例python
- laravel - 如何在 Laravel 中建立模型和数据透视表之间的关系?
- python - 如何让 pygame 中的 make 按钮正常工作?(刽子手游戏)
- mysql - 如何编写多对多的sql脚本
- php - 使用 laravel 插入图像时如何在 public/storage/annonces/Month2020 中创建文件夹?
- flutter - 是连接到 Firestore 所需的苹果开发者帐户
- javascript - 突变不更新Vuex中的数据
- sas - 使用多个电子表格将 SAS 中的多个数据集输出到一个 excel 输出中
- python - 如何使用 pymongo 和 Flask-Login 的会话?