当用户使用不同的语言时,工作表的名称会发生变化
The names of sheets are changed when users use different languages
我使用公式 {'Form Responses 1'! A1: G; 'Form Responses 2'! A2: G; ...}
将所有 sheet 的数据合并为一个 sheet。但是,当用户使用英语以外的语言时,sheet 的名称会发生变化,并且相关的公式会损坏。
谁能帮我解决这个问题,先谢谢了。
代码:
function copy() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SpssId = ss.getSheetByName('title').getRange('AH6').getValue();
var destinationSpss = SpreadsheetApp.openById(SpssId);
for (var i = 1; i < destinationSpss.getNumSheets(); i++) {
var index = destinationSpss.getSheetByName('index');
index.getRange(i+1,2,1,4)
.setFormulas([["='Form Responses "+i+"'!B2","='Form Responses "+i+"'!D2","='Form Responses "+i+"'!C2","='Form Responses "+i+"'!E2"]]);
}}
感谢您提供代码。看到您目前的情况非常有帮助。
我们可以假设 index
是目标传播 sheet 中唯一不是表单响应 sheet 之一的 sheet 吗?从您的代码来看,我们似乎可以这样假设。
那么我们可以只使用 Spreadsheet.getSheets()
to get an array of all the sheets and Sheet.getName()
来获取他们的名字,而不考虑语言:
function copy() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SpssId = ss.getSheetByName('title').getRange('AH6').getValue();
var destinationSpss = SpreadsheetApp.openById(SpssId);
var sheets = destinationSpss.getSheets() // Get an array of the sheets
var index = destinationSpss.getSheetByName('index');
for (var i = 0; i < sheets.length; i++) {
var sheetName = sheets[i].getName();
if (sheetName === 'index') break;
index.getRange(i + 1, 2, 1, 4)
.setFormulas([[`="${sheetName}"!B2`,`="${sheetName}"!D2`,`="${sheetName}"!C2`,`="${sheetName}"!E2`]])
}
}
(我正在使用 template literals 来格式化公式字符串,这只是让代码更简洁,但这当然不是必需的。)
你总能假设 index
sheet 在索引 0 处吗?我不确定你是否可以,所以我会扩展你的 for 循环以包含 i = 0
并添加检查 if (sheetName === 'index') break;
以中断如果你在 index
sheet.
顺便说一句,您会看到我也将 var index = destinationSpss.getSheetByName('index');
移到了 for 循环之外。应用程序脚本 API 对于某些操作可能会很慢,并且由于您在每次迭代中引用相同的 index
sheet,如果您调用此 [=11],您的代码会更快=] sheet 就一次。
我使用公式 {'Form Responses 1'! A1: G; 'Form Responses 2'! A2: G; ...}
将所有 sheet 的数据合并为一个 sheet。但是,当用户使用英语以外的语言时,sheet 的名称会发生变化,并且相关的公式会损坏。
谁能帮我解决这个问题,先谢谢了。
代码:
function copy() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SpssId = ss.getSheetByName('title').getRange('AH6').getValue();
var destinationSpss = SpreadsheetApp.openById(SpssId);
for (var i = 1; i < destinationSpss.getNumSheets(); i++) {
var index = destinationSpss.getSheetByName('index');
index.getRange(i+1,2,1,4)
.setFormulas([["='Form Responses "+i+"'!B2","='Form Responses "+i+"'!D2","='Form Responses "+i+"'!C2","='Form Responses "+i+"'!E2"]]);
}}
感谢您提供代码。看到您目前的情况非常有帮助。
我们可以假设 index
是目标传播 sheet 中唯一不是表单响应 sheet 之一的 sheet 吗?从您的代码来看,我们似乎可以这样假设。
那么我们可以只使用 Spreadsheet.getSheets()
to get an array of all the sheets and Sheet.getName()
来获取他们的名字,而不考虑语言:
function copy() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SpssId = ss.getSheetByName('title').getRange('AH6').getValue();
var destinationSpss = SpreadsheetApp.openById(SpssId);
var sheets = destinationSpss.getSheets() // Get an array of the sheets
var index = destinationSpss.getSheetByName('index');
for (var i = 0; i < sheets.length; i++) {
var sheetName = sheets[i].getName();
if (sheetName === 'index') break;
index.getRange(i + 1, 2, 1, 4)
.setFormulas([[`="${sheetName}"!B2`,`="${sheetName}"!D2`,`="${sheetName}"!C2`,`="${sheetName}"!E2`]])
}
}
(我正在使用 template literals 来格式化公式字符串,这只是让代码更简洁,但这当然不是必需的。)
你总能假设 index
sheet 在索引 0 处吗?我不确定你是否可以,所以我会扩展你的 for 循环以包含 i = 0
并添加检查 if (sheetName === 'index') break;
以中断如果你在 index
sheet.
顺便说一句,您会看到我也将 var index = destinationSpss.getSheetByName('index');
移到了 for 循环之外。应用程序脚本 API 对于某些操作可能会很慢,并且由于您在每次迭代中引用相同的 index
sheet,如果您调用此 [=11],您的代码会更快=] sheet 就一次。