Javascript 使用GAS在googlesheet选项卡之间添加数据
我想将一些数据从谷歌工作表的一个选项卡添加到另一个选项卡。一旦数据被追加,我想更新一个名为“追加”的列,并将其设置为“是”。我的代码应该跳过任何已经附加的行,但是我是一个初学者,所以这对我来说有点新鲜Javascript 使用GAS在googlesheet选项卡之间添加数据,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我想将一些数据从谷歌工作表的一个选项卡添加到另一个选项卡。一旦数据被追加,我想更新一个名为“追加”的列,并将其设置为“是”。我的代码应该跳过任何已经附加的行,但是我是一个初学者,所以这对我来说有点新鲜 function dumpSMSintoSender() { var MOVED_TO_SENDER = "Yes"; var userSheet = SpreadsheetApp.getActiveSpreadsheet(); var userTab = userShee
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();
}
}
}
}
函数dumpSMSintoSender(){
var移动到发送人=“是”;
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(第一行,3,numRows,10)
//获取范围中每行的值。
var Movedata=dataRange.getValues();
对于(变量i=0;i
实际发生的是,对于代码中的每个循环,都会从工作表中追加所有内容。因此,如果有5条记录要追加,新选项卡中将出现25条新记录,因为每条记录追加了5次(每次迭代一次)。是否可以将代码更改为仅附加“已附加”列为空的行?我试图使其保持简单,并将要检查的两项-移动(
mobile\u COL
)和移动到发送方(moved\u to\u sender\u COL
),排除在循环之外。它们被定义在顶部,以适应将来的任何更改,例如移动到\u发送方
然后获取整个工作表范围和值。并逐行比较上述代码中所示的值,以查找之前未追加的新行
找到新行后,将其添加到results
数组中,并将当前行的附加值更新为“Yes”。将所有新行放入结果
数组后,我们将它们写入发送选项卡
。并使用更新的用户值
更新用户选项卡
这里的诀窍是将所有新行累加起来,然后一次性将它们写在一起。它比一行一行地写要快。更新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);
}
您好,Evision,欢迎来到StackOverflow。从你的问题中我可以得出结论,你似乎是编程新手。没关系,我们都是从某个地方开始的。在未来,请看一看。它有助于直观地组织代码,并使任何试图帮助您的人都更容易阅读。大多数可用的编程工具甚至都具有这种内置功能。请在以后发布代码时使用它。谢谢你的回答,这似乎很有效,我只需要问一下如何进行更改。目前,这会将所有列追加到新工作表中。您能告诉我如何修改此项以仅附加第2、3和4列吗?(C、D&E)例如。所有其他功能都是完美的<代码>结果。推送([第[2]行、第[3]行、第[4]行])代码>换成这个。col C=3,不是2一切都正常,我只剩下一个问题。。。包含正在移动的数据的选项卡包含许多公式。但是,每次脚本运行时,它都会删除所有公式,只留下值。有什么我可以改变的吗?