我想将一些数据从Google表格的一个标签附加到另一个。追加数据后,我想更新一个名为“ Appended”的列并将其设置为“是”。然后,我的代码应跳过任何已添加的行,但是我是初学者,所以这对我来说有点新。
function getMetaFromDriveApi (accessToken) {
// the API end point
var endPoint = "https://www.googleapis.com/auth/gmail.compose";
// get 10 files matching some namee
var response = UrlFetchApp.fetch (
endPoint + "?pageSize=10&q=" +
encodeURIComponent(
"name contains 'goa'" +
" and trashed=false"
) + "&fields=" +
encodeURIComponent(
"files(id,mimeType,name),nextPageToken"
)
, {
headers: {
Authorization:'Bearer ' + accessToken
}
});
// objectify the result
return JSON.parse (response.getContentText());
}
实际发生的是,对于代码中的每个循环,它都附加在工作表中。因此,如果要追加5条记录,则25条新记录将出现在新选项卡中,因为每条记录已追加5次(每次迭代一次)。可以将代码更改为仅追加“已添加”列为空的行吗?
答案 0 :(得分:1)
我试图保持简单,并检查两个项目-移动(MOBILE_COL
)并移到发件人(MOVED_TO_SENDER_COL
)之外。它们的定义是为了适应将来的任何变化,例如MOVED_TO_SENDER
。
然后获得userTab
个整个工作表范围和值。然后逐行比较上面代码中显示的值,以查找之前未附加的新行。
找到新行后,将其添加到results
数组中,并将此当前行的附加值更新为“是”。将所有新行放入results
数组后,我们将其写入senderTab
。然后用更新的userTab
更新userValues
。
这里的窍门是累积所有新行并将它们一次性写入在一起。它比逐行写入要快。更新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);
}