Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。JavaScriptやJScript,HTAに最近はまってます。

アンケートづくり テキスト出力部分も統合

さて,やっとJScript,HTML部分の最後です。たぶん。

けっこう確認はしたんですが・・・どうでしょう。(;´∀`)

Excelとの連携はまだです。

メモ帳などにUTF-8文字コードで出力し,拡張子HTAで保存すればたぶん動きます。たぶん(;´∀`)

dataフォルダを直下につくり,その中に出力データをtextで出力するはずです。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>無題ドキュメント</title>
<style type="text/css">
  table{border-collapse: collapse;}
  table,tr,td{border: solid 2px black;}
  td.clsmondai{padding-left: 5px;font-weight: bold;background-color: black;color: white;width:400px}
  td.clskaito{padding-left: 20px;background-color: antiquewhite}
  </style>
<script>
  var ForReading = 1;
  var ForWriting = 8;
  var p=[
    [1,"クラス","select",["1A","1B","1C"]],
    [2,"番号","select",renban(1,41)],
    [3,"食べ物をひとつえらべ","radio",["りんご","みかん","バナナ"]],
    [5,"てすとですよ","text"]
  ]
  var thisName=location.pathname
  
  thisName=thisName.slice(thisName.lastIndexOf("\\")+1,thisName.lastIndexOf("."));
  var fso = new ActiveXObject("Scripting.FileSystemObject");	
  if (fso.FolderExists(".\\data")==false) fso.CreateFolder(".\\data");
  var DataFile = ".\\data\\"+thisName+"data.txt";
  if (fso.FileExists(DataFile)==false){
    var data = fso.OpenTextFile(DataFile, ForWriting,true);
    var tmp="user"
    for (var i=0;i<p.length;i++){tmp+="◇"+p[i][1]}
    tmp+="◇Date"
    data.WriteLine(tmp);
    data.Close()
  } 
  var User=new ActiveXObject("WScript.Network").UserName;
  
  //ベタ打ちここまで
  
  function init(){
    resizeTo(500,600);
    makeForm()
  }
  
  function renban(s,e){
    var arr=[]
    for (var i=s;i<=e;i++) arr.push(i)
    return arr
  }
  
  function makeForm(){
    var tmp=[]
    tmp.push("<table>")
    for(var i=0;i<p.length;i++) tmp.push(makeElement(i))
    tmp.push("</table>")
    document.getElementById("table").innerHTML=tmp.join("")
  }
  
  function makeElement(No){
    var mondai=p[No][1]
    var name="No"+(No)
    var type=p[No][2]
    var arr=p[No][3]
    tablepart=document.getElementById("table")
    var html=[];
    var tmp;
    switch(type){
      case "select":tmp = makeSelectElement(name,"select",arr);break
      case "radio":tmp = makeSelectElement(name,"radio",arr);break
      case "check":tmp = makeSelectElement(name,"checkbox",arr);break
      case "text":tmp="<input type='text' name='" + name + "' size='45' />";break
      case "multi":tmp="<textarea name='" + name +"' rows='5' cols='46' ></textarea>";break
    }
    
    html.push("<tr><td class='clsmondai'>" + (No+1) + " " + mondai + "</td></tr>")
    html.push("<tr><td class='clskaito'>")
    html.push(tmp+"</td>")
    
    return html.join("")
  }

  function makeSelectElement(name,type,arr){
    switch(type){
      case "select":
        var tmp=[]
        tmp.push("<select name='" + name +"'>")
        for(var i=0;i<arr.length;i++){tmp.push("<option value='" + arr[i]+"'>"+arr[i]+"</option>")}
        tmp.push("</select>")
        element=tmp.join("")
        break
      case "radio":
      case "checkbox": //間違いじゃないよ
        var tmp=[]
        for(var i=0;i<arr.length;i++){
          tmp.push("<input type='"+ type +"' name='" + name + "' value='" + arr[i] +"'>"+arr[i]+"<br>")
        }
        element=tmp.join("")
        break

    }
    return element
  }
  // データ収集部分
  function result(){
    var html=[]
    html.push(User+"◇")
    for (var i=0;i<p.length;i++){
      html.push(getData("No"+i,p[i][2])+"◇")
    }
    html.push(Date())
    return html.join("")
  }

  function PostData(str){
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var data = fso.OpenTextFile(DataFile, ForWriting);
    data.WriteLine(result());
    data.Close();
    document.forms[0].reset()
  }
		
		
  function getData(name,type){
    switch(type){
      case "radio":
      case "check":
      return getCheck(name);
    break;
      case "text":
      case "multi":
      case "select":
    return document.getElementsByName(name)[0].value.replace(/\r?\n/g,"_");
    break;
    }
  }
    
  function getCheck(name){
      var CHECK=document.getElementsByName(name)
      var tmp=""
      for(var i=0;i<CHECK.length;i++){
        if(CHECK[i].checked) tmp+="_" +CHECK[i].value
      }
      return tmp.substring(1)
  }
</script>
</head>
<body onload="init()">
  <form id="formFld">
    <div id="table"></div>
    <input type="button" href="#" value="送信する" onClick="PostData()"/>
  </form>
</body>
</html>

だいぶまたいじってます。

 var p=[
    [1,"クラス","select",["1A","1B","1C"]],
    [2,"番号","select",renban(1,41)],
    [3,"食べ物をひとつえらべ","radio",["りんご","みかん","バナナ"]],
    [5,"てすとですよ","text"]
  ]

質問のパラメータを二次配列?に固めました。連番も専用の関数を用意。40人とか相手のときはこのほうがいいかな,と。
この部分とタイトルさえExcelから出力すればいいように作った・・はず。

どうかなー