我想将 Google 表格中一个选项卡中的一些数据附加到另一个选项卡中。附加数据后,我想更新名为“附加”的列并将其设置为"is"。然后,我的代码应该跳过任何已附加的行,但是我是初学者,所以这对我来说有点新鲜。
function dumpSMSintoSender() {
var MOVED_TO_SENDER = "Yes";
var userSheet = SpreadsheetApp.getActiveSpreadsheet();
var userTab = userSheet.getSheetByName('SmartCare');
var SenderTab = userSheet.getSheetByName('Sheet1');
var numRows = 200
var firstRow = 2;
var range = userTab.getRange(firstRow, 3, userTab.getLastRow() - firstRow +1, 3);
var data = range.getValues();
var dataRange = userTab.getRange(firstRow, 3, numRows, 10)
// Fetch values for each row in the Range.
var Movedata = dataRange.getValues();
for (var i = 0; i < Movedata.length; ++i) {
var row = Movedata[i];
var MovedtoSender = row[5];
var sender = row[0];
var mobile = row[1];
var message = row[2];
if (mobile != "") {
if (MovedtoSender != MOVED_TO_SENDER) { // Prevents sending duplicates
SenderTab.getRange(SenderTab.getLastRow() + 1, 1, data.length,3).setValues(data);
userTab.getRange(firstRow + i, 8).setValue("Yes");
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
}
实际发生的情况是,对于代码中的每个循环,它都会附加工作表中的所有内容。因此,如果要追加 5 条记录,则新选项卡中将出现 25 条新记录,因为每条记录已追加 5 次(每次迭代一次)。是否可以将代码更改为仅附加“附加”列为空的行?
最佳答案
我试图保持简单,并且要检查两个项目 - 移动设备 (MOBILE_COL
) 和移动到发件人 (MOVED_TO_SENDER_COL
),不存在循环。它们是在顶部定义的,以适应 future 的任何更改,例如 MOVED_TO_SENDER
。
然后获取userTab
整个工作表范围和值。并按照上面的代码所示逐行比较值,以查找之前未附加的新行。
找到新行后,将其添加到 results
数组中,并将当前行附加值更新为"is"。将所有新行放入 results
数组后,我们将它们写入 senderTab
中。并使用更新的 userValues
更新 userTab
。
这里的技巧是累积所有新行并将它们一次性写入在一起。它比逐行写入要快。更新userTab
时应用相同的方法。我们更新内存中的userValues
,最后一次性将整个数组写入userTab
。
function dumpSMSintoSender() {
// value to check for
var MOVED_TO_SENDER = 'Yes';
// which column is mobile, which is first item to test
var MOBILE_COL = 4; // A = 1, B = 2 etc
// which column is move to sender = appended, which is second item to test
var MOVED_TO_SENDER_COL = 8; // A = 1, B = 2 etc
var ss = SpreadsheetApp.getActiveSpreadsheet();
var userTab = ss.getSheetByName('SmartCare');
var senderTab = ss.getSheetByName('Sheet1');
// getting userTab full sheet range and values
var userRange = userTab.getDataRange();
var userValues = userRange.getValues();
// array to keep new append-able rows
var results = [];
// for each row in userValues check to see if append-able
// if yes, add to results array and update userValues array by setting appended to 'Yes'
userValues.forEach(function(row) {
if (row[MOBILE_COL - 1] != '') {
if (row[MOVED_TO_SENDER_COL - 1] != MOVED_TO_SENDER) {
results.push(row);
row[MOVED_TO_SENDER_COL - 1] = MOVED_TO_SENDER;
}
}
});
// write new rows to senderTab
senderTab
.getRange(senderTab.getLastRow() + 1, 1, results.length, results[0].length)
.setValues(results);
// update userTab
userRange.setValues(userValues);
}
关于javascript - 使用 GAS 在 Google 工作表选项卡之间附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55706370/