App Script new Google Sheet 创建问题
App Script new Google Sheet creation issue
我正在尝试编写一个 App 脚本,它从多个不同的电子表格(完全独立的文档)中获取字符串数据并将它们全部放入一个新的电子表格中。当我 运行 记录器时,它会显示我想要的所有数据。我希望每条数据都显示在 A 列中,但是当我 运行 我的脚本时,它只将 1 个数据点而不是所有数据点放入电子表格中。有人可以给我一些指导吗?这是我的代码:
function pullTogether() {
var files = DriveApp.getFolderById('Folder ID').searchFiles('title != "nothing"');
const rangeName = 'Sheet1!B2:C';
while(files.hasNext()){
var xFile = files.next();
var name = xFile.getId();
const values = Sheets.Spreadsheets.Values.get(name, rangeName).values;
for (const row in values) {
var a1 = (values[row][0]);
Logger.log(a1);
var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
var cell = ss.getRange("A2");
cell.setValue(a1);
}
}
}
我相信你的目标如下。
- 您想从特定文件夹下的每个 Spreadsheet 的“B”列中检索值。
- 您想将检索到的值放入目标的“A”列 sheet。
修改点:
关于 but when I run my script, it only puts 1 data point in the spreadsheet instead of all of them.
,当我看到你的脚本时,检索到的值总是放在目标 sheet 的单元格“A2”中。我认为这可能是您遇到问题的原因。
在你的脚本中,我认为当使用以下流程时,流程成本会变低。通过这个流程,你的问题也可以被移除。
在您的情况下,即使未使用 Sheets API,脚本也可以使用 getValues()
.
当这些点体现在你的脚本中,就变成了下面这样。
修改后的脚本:
请设置文件夹 ID 和目标 Spreadsheet ID。
function pullTogether() {
// Retrieve values from each Spreadsheet.
var values = [];
var files = DriveApp.getFolderById('Folder ID').searchFiles(`title != 'nothing' and mimeType='${MimeType.GOOGLE_SHEETS}'`);
var sheetName = 'Sheet1'
while (files.hasNext()) {
var xFile = files.next();
var sheet = SpreadsheetApp.open(xFile).getSheetByName(sheetName);
if (sheet) {
var v = sheet.getRange("B2:B" + sheet.getLastRow()).getValues();
values = [...values, ...v];
}
}
// Put values to the destination sheet.
var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
var dstSheet = ss.getSheets()[0];
dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
注:
虽然我不确定你的实际情况,当上面的脚本对大数据不起作用时,请修改如下。
来自
dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
至
Sheets.Spreadsheets.Values.update({ values }, ss.getId(), `'${dstSheet.getSheetName()}'!A2`, { valueInputOption: "USER_ENTERED" });
参考文献:
我正在尝试编写一个 App 脚本,它从多个不同的电子表格(完全独立的文档)中获取字符串数据并将它们全部放入一个新的电子表格中。当我 运行 记录器时,它会显示我想要的所有数据。我希望每条数据都显示在 A 列中,但是当我 运行 我的脚本时,它只将 1 个数据点而不是所有数据点放入电子表格中。有人可以给我一些指导吗?这是我的代码:
function pullTogether() {
var files = DriveApp.getFolderById('Folder ID').searchFiles('title != "nothing"');
const rangeName = 'Sheet1!B2:C';
while(files.hasNext()){
var xFile = files.next();
var name = xFile.getId();
const values = Sheets.Spreadsheets.Values.get(name, rangeName).values;
for (const row in values) {
var a1 = (values[row][0]);
Logger.log(a1);
var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
var cell = ss.getRange("A2");
cell.setValue(a1);
}
}
}
我相信你的目标如下。
- 您想从特定文件夹下的每个 Spreadsheet 的“B”列中检索值。
- 您想将检索到的值放入目标的“A”列 sheet。
修改点:
关于
but when I run my script, it only puts 1 data point in the spreadsheet instead of all of them.
,当我看到你的脚本时,检索到的值总是放在目标 sheet 的单元格“A2”中。我认为这可能是您遇到问题的原因。在你的脚本中,我认为当使用以下流程时,流程成本会变低。通过这个流程,你的问题也可以被移除。
在您的情况下,即使未使用 Sheets API,脚本也可以使用
getValues()
.
当这些点体现在你的脚本中,就变成了下面这样。
修改后的脚本:
请设置文件夹 ID 和目标 Spreadsheet ID。
function pullTogether() {
// Retrieve values from each Spreadsheet.
var values = [];
var files = DriveApp.getFolderById('Folder ID').searchFiles(`title != 'nothing' and mimeType='${MimeType.GOOGLE_SHEETS}'`);
var sheetName = 'Sheet1'
while (files.hasNext()) {
var xFile = files.next();
var sheet = SpreadsheetApp.open(xFile).getSheetByName(sheetName);
if (sheet) {
var v = sheet.getRange("B2:B" + sheet.getLastRow()).getValues();
values = [...values, ...v];
}
}
// Put values to the destination sheet.
var ss = SpreadsheetApp.openById("ID of new spreadsheet"); //I have the real ID in my code
var dstSheet = ss.getSheets()[0];
dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
注:
虽然我不确定你的实际情况,当上面的脚本对大数据不起作用时,请修改如下。
来自
dstSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
至
Sheets.Spreadsheets.Values.update({ values }, ss.getId(), `'${dstSheet.getSheetName()}'!A2`, { valueInputOption: "USER_ENTERED" });