やりたいこと
HTMLService側で、スプレッドシートのurlとnameをselect optionに保存したい
こういう挙動を実現したい
- テキストボックスにスプレッドシートのURLを入力する
- saveボタンをクリックする
- .gs側でスプレッドシートのnameを取得する
- urlとnameを{url: name}の形でスクリプトのプロパティに保存する
- HTMLにJSONで返してselectのoptionのidにurlを、innerHTMLにnameを入れる
- open sheetのhrefにurlを入れる
- 別のスプレッドシートのURLを入れてsaveボタンをクリックする
- selectのoptionが増えてopen sheetのhrefも変わる
- optionを変更するとopen sheetのhrefも変わる
イメージ
コード.gs
function doGet() {
return HtmlService.createTemplateFromFile('index').evaluate().setTitle("save ID and NAME ");
}
function saveSpreadsheetURL(new_ss_url) {
var ss = SpreadsheetApp.openByUrl(new_ss_url);
var ss_name = ss.getName();
var ss_urls = getProp("ss_urls");
if(ss_urls === null) {
var obj = {}// nullならオブジェクトを作る(初回のみ)
} else {
var obj = JSON.parse(ss_urls);
}
obj[new_ss_url] = ss_name;
var json = JSON.stringify(obj);
setProp("ss_urls", json);
return json;
}
function getProp(key) {
return PropertiesService.getScriptProperties().getProperty(key);
}
function setProp(key, value) {
PropertiesService.getScriptProperties().setProperty(key, value);
}
|
index.html
<!DOCTYPE html>
<html>
<body>
<select id="ss_select">
</select>
<input type="text" id="new_ss_url">
<button id="save">save</button>
<a id="open_sheet" target="_blank" href="">open sheet</a>
<script>
google.script.run.withSuccessHandler(ssLoaded).getProp("ss_urls");
elem("save").onclick = saveClicked;
elem("ss_select").onchange = selectChanged;
function elem(id) {
return document.getElementById(id);
}
function ssLoaded(ssListJSON) {
if(ssListJSON) {
createSSList(ssListJSON);
selectChanged();
}
}
function saveClicked() {
var new_ss_url = elem("new_ss_url").value.split("#gid=")[0]// + "#gid=0";
google.script.run
.withFailureHandler(onFailure)
.withSuccessHandler(ssSaved)
.saveSpreadsheetURL(new_ss_url);
}
function ssSaved(ssListJSON) {
createSSList(ssListJSON);
}
function createSSList(ssListJSON) {
var parentId = "ss_select";
removeChilds(parentId);
var obj = JSON.parse(ssListJSON);
var keys = Object.keys(obj);
var ss_select = elem(parentId);
for(var i = 0; i < keys.length; i++) {
var option = document.createElement("option");
option.id = keys[i];
option.name = obj[keys[i]];
option.innerHTML = obj[keys[i]];
ss_select.appendChild(option);
}
}
function selectChanged() {
var select = elem("ss_select");
var index = select.selectedIndex;
var ssUrl = select[index].id;
elem("new_ss_url").value = ssUrl;
elem("open_sheet").href = ssUrl;
}
function removeChilds(id) {
var target = elem(id);
for (var i = target.childNodes.length - 1; i >= 0; i--) {
target.removeChild(target.childNodes[i]);
}
}
function onFailure(e) {
alert([e.message, e.stack]);
}
</script>
</body>
</html>
|
