[英]Code to get Spreadsheet URL through it's name and paste in another spreadsheet
所以,我有一個包含2列的工作表,A列是電子表格的名稱,B列是它的URL。 所以我使用腳本來獲取URL,通過它的名稱,但最后一行不起作用。 誰能幫我?
function spreadsheetUrl() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName('Page1'));
var lastRow = ss.getRange("B2:B200").getLastRow();
var newRow = lastRow+1;
var range = SpreadsheetApp.getActiveSheet().getRange(newRow, 1);
var spreadsheetName = range.getValue();
var files = DriveApp.getFilesByName(spreadsheetName);
while (files.hasNext()){
var file = files.next();
var url = file.getUrl();
return url
}
getValue(url).Paste_Values(getRange(newRow, 2), {contentsOnly: true});
}
while循環中的return url
語句在getValue
運行之前退出函數。
我懷疑你想要的是用getValue
語句替換return url
語句,以便它為每一行運行。
while (files.hasNext()){
var file = files.next();
var url = file.getUrl();
getValue(url).Paste_Values(getRange(newRow, 2), {contentsOnly: true});
}
您將使用代碼遇到的一個問題是,當您添加更多網址時,newrow不會更改,實際上您實際上希望文件名旁邊的網址不在列表的末尾。 此函數將vA1 [i] [0]中的文件名放入url列vA2 [i] [0]中,並且還計算每個名稱的文件數並記錄信息並將其顯示在對話框中在功能結束時,讓您有機會確保您已獲得正確的文件。 如果您習慣於存儲文件的備份,則會發生這種情況。
還可以考慮將對話框放在循環中,從而讓您選擇要保存的對話框,但這需要您在功能運行時觀看它。
function spreadsheetUrl() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Page1');
var rg1=sh.getRange(2,1,sh.getLastRow(),1);
var rg2=sh.getRange(2,2,sh.getLastRow(),1);
var vA1=rg1.getValues();//Spreadsheet Names
var vA2=rg2.getValues();//Urls
var xf=[];
for(var i=0;i<vA1.length;i++) {
if(vA1[i][0]) {
var files=DriveApp.getFilesByName(vA1[i][0]);
var n=0;
while (files.hasNext()){
var file = files.next();
if(n==0) {
vA2[i][0]=file.getUrl();
}else{
xf.push({name:file.getName(),url:file.getUrl(),id:file.getId()});
}
n++;
}
}
}
rg2.setValues(vA2);
var html='<h1>You have additional files with the same names</h1>';
if(xf.length) {
for(var i=0;i<xf.length;i++) {
html+=Utilities.formatString('<br />Name: %s Url: %s Id: %s',xf[i].name, xf[i].url,xf[i].id);
}
html+='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
var userInterface=HtmlService.createHtmlOutput(html).setWidth(1000);
SpreadsheetApp.getUi().showModelessDialog(userInterface, "Files with Identical Names")
}
}
我玩了一下這個版本,這個版本允許你修改當有一個特定名稱的文件時發布的網址。 它在結束時而不是在循環的中間執行,因此在循環運行時不必執行多次。 此版本還具有附加功能,用於將更改寫入表單服務器端。
function spreadsheetUrl() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Page1');
var rg1=sh.getRange(2,1,sh.getLastRow(),1);
var rg2=sh.getRange(2,2,sh.getLastRow(),1);
var vA1=rg1.getValues();//Spreadsheet Names
var vA2=rg2.getValues();//Urls
//rg2.clearContent();//debug
var xf=[];
for(var i=0;i<vA1.length;i++) {
if(vA1[i][0]) {
var files=DriveApp.getFilesByName(vA1[i][0]);
var n=0;
while (files.hasNext()){
var file = files.next();
if(n==0) {
vA2[i][0]=file.getUrl();
}else{
xf.push({name:file.getName(),url:file.getUrl(),id:file.getId(),row:i+2});
}
n++;
}
}
}
rg2.setValues(vA2);
var html='<h1>You have additional files with the same names</h1>';
html+='<br />Change them if you wish by select the select Me button for the appropriate selection.';
html+='<br />Press close when you done.';
if(xf.length) {
for(var i=0;i<xf.length;i++) {
html+=Utilities.formatString('<br />Name: %s Id: %s<input type="button" value="Select Me" onClick="selectMe(\'%s\',%s);" />',xf[i].name,xf[i].id,xf[i].url,xf[i].row);
}
html+='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
html+='<script>function selectMe(value,row){console.log(value);console.log(row);google.script.run.selectMe("Page1",value,row);}console.log("My Code");</script>';
var userInterface=HtmlService.createHtmlOutput(html).setWidth(400).setHeight(300);
SpreadsheetApp.getUi().showModelessDialog(userInterface, "Files with Identical Names")
}
}
function selectMe(sheetname,value,row) {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName(sheetname);
var rg=sh.getRange(row,2).setValue(value);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.