Google Sheet 不复制行以更正 sheet
Google Sheet not copying rows to correct sheet
我将 sheet 数据拆分为多个 sheet,使用电子邮件地址作为唯一标识符。
我正在使用我发现并编辑过的一些脚本的变体,但使用的是 copyTo 而不是 appendRow。
问题是它似乎将特定数据集的最后一行复制到后续的sheet。
我认为这可能是因为我使用的是 getActiveSheet 而不是明确定位正确的 sheet,所以我尝试这样做,使用类似的东西:getSheetByName(emailAddress[i][0])。
但是,它不断出现 null。当我记录 emailaddress 的值时,查看记录器,值显示正确,所以不太确定为什么我得到空值。
以下是“有效”的脚本,但将最后一行复制到后续 sheet。
function myFunction() {
var theWorkbook = SpreadsheetApp.getActiveSpreadsheet();
var theSheet = theWorkbook.getSheetByName("Copied");
// This var will contain all the values from column B -> The email addresses
var theEmails = theSheet.getRange("B:B").getValues();
// This var will contain all the rows
var rows = theSheet.getDataRange().getValues();
//Set the first row as the header
var header = rows[0];
//Store the Sheets already created
var completedSheets = []
//The last created Sheet
var last = theEmails[1][0]
for (var i = 1; i < theEmails.length; i++) {
//Check if the Sheet is already done, if not create the sheet
if(!completedSheets.includes(theEmails[i][0])) {
//Set the Sheet name = email address (except if there is no name, then = Blank)
if (theEmails[i][0] === "") {
var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Blank");
} else {
var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(theEmails[i][0]);
}
//append the header
currentSheet.appendRow(header);
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(currentSheet.getRange(currentSheet.getLastRow()+1, 1));
completedSheets.push(theEmails[i][0])
last = theEmails[i][0]
} else if (last == theEmails[i][0]) {
// If the sheet is created append the row to the sheet
var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
var activespreadsheet = SpreadsheetApp.getActiveSheet();
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));
}
}
}
还有我试图命名 sheet(以及它的许多变体)的代码片段,尽管这个 returns 是一个空错误。
else if (last == theEmails[i][0]) {
// If the sheet is created append the row to the sheet
var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
var activespreadsheet =SpreadsheetApp.getActive().getSheetByName(last);
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));
我做错了什么?
这是值数组基于索引零而 API 的“行”和“列”基于索引一的经典表格问题。
在您的 for
循环中,您对值数组和 getRange(row, ...)
调用中的 API“行”参数使用相同的索引 i
。使用表格的任何人都对自己这样做过,可能很多次了。
更新你的位置
var rowtocopy = theSheet.getRange(i,1,1,8);
至
var rowtocopy = theSheet.getRange(i + 1,1,1,8);
它会起作用。
我将 sheet 数据拆分为多个 sheet,使用电子邮件地址作为唯一标识符。
我正在使用我发现并编辑过的一些脚本的变体,但使用的是 copyTo 而不是 appendRow。
问题是它似乎将特定数据集的最后一行复制到后续的sheet。
我认为这可能是因为我使用的是 getActiveSheet 而不是明确定位正确的 sheet,所以我尝试这样做,使用类似的东西:getSheetByName(emailAddress[i][0])。
但是,它不断出现 null。当我记录 emailaddress 的值时,查看记录器,值显示正确,所以不太确定为什么我得到空值。
以下是“有效”的脚本,但将最后一行复制到后续 sheet。
function myFunction() {
var theWorkbook = SpreadsheetApp.getActiveSpreadsheet();
var theSheet = theWorkbook.getSheetByName("Copied");
// This var will contain all the values from column B -> The email addresses
var theEmails = theSheet.getRange("B:B").getValues();
// This var will contain all the rows
var rows = theSheet.getDataRange().getValues();
//Set the first row as the header
var header = rows[0];
//Store the Sheets already created
var completedSheets = []
//The last created Sheet
var last = theEmails[1][0]
for (var i = 1; i < theEmails.length; i++) {
//Check if the Sheet is already done, if not create the sheet
if(!completedSheets.includes(theEmails[i][0])) {
//Set the Sheet name = email address (except if there is no name, then = Blank)
if (theEmails[i][0] === "") {
var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Blank");
} else {
var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(theEmails[i][0]);
}
//append the header
currentSheet.appendRow(header);
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(currentSheet.getRange(currentSheet.getLastRow()+1, 1));
completedSheets.push(theEmails[i][0])
last = theEmails[i][0]
} else if (last == theEmails[i][0]) {
// If the sheet is created append the row to the sheet
var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
var activespreadsheet = SpreadsheetApp.getActiveSheet();
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));
}
}
}
还有我试图命名 sheet(以及它的许多变体)的代码片段,尽管这个 returns 是一个空错误。
else if (last == theEmails[i][0]) {
// If the sheet is created append the row to the sheet
var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
var activespreadsheet =SpreadsheetApp.getActive().getSheetByName(last);
var rowtocopy = theSheet.getRange(i,1,1,8);
rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));
我做错了什么?
这是值数组基于索引零而 API 的“行”和“列”基于索引一的经典表格问题。
在您的 for
循环中,您对值数组和 getRange(row, ...)
调用中的 API“行”参数使用相同的索引 i
。使用表格的任何人都对自己这样做过,可能很多次了。
更新你的位置
var rowtocopy = theSheet.getRange(i,1,1,8);
至
var rowtocopy = theSheet.getRange(i + 1,1,1,8);
它会起作用。