我想将一些数据从Google表格中的一个标签附加到另一个标签。附加数据后,我想更新一个名为"已追加"的列并将其设置为"是"。然后,我的代码应该跳过已经附加的任何行,但是我是初学者,所以这对我来说有点新。
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
(,脱离循环。它们被定义在顶部以适应任何未来的变化,例如MOVED_TO_SENDER
。
然后userTab
整个工作表范围和值。并逐行比较上面代码中显示的值,以查找以前未附加的新行。
找到新行后,将其添加到数组results
并将当前行追加值更新为"是"。将所有新行放入数组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);
}